错误:从“常量字符*”到“字符*”的转换无效

error: invalid conversion from ‘const char*’ to ‘char*’

本文关键字:字符 无效 转换 常量字符 常量 错误      更新时间:2023-10-16

可能的重复项:
将 strtok 与 std::string 一起使用

#include<iostream>
#include <string>
#include <string.h>
using namespace std;
int main()
{
    string s("hello hi here whola");
    string background;
    char *strval;
    char* tok = strtok_r(s.c_str()," ",&strval);
    while(tok !=NULL)
    {
    cout << tok <<"n";
    if (tok == "&")
        background = tok;
    else
    {
        statements1;
        statement2.. ;
    }
    tok = strtok_r(NULL, " ",&strval);
    }
    return 0;
}

输出:

new.cpp: In function ‘int main()’:
new.cpp:13:47: error: invalid conversion from ‘const char*’ to ‘char*’ [-fpermissive]
/usr/include/string.h:359:14: error:   initializing argument 1 of ‘char* strtok_r(char*, const char*, char**)’ [-fpermissive]

s.c_str()返回指向常量字符的指针,以防止您修改备份内存。您需要使用strdup()函数制作此常量字符串的可写副本,因为它确实strtok()修改了您正在扫描令牌的字符串。

strtok修改其参数。string.c_str()不允许这样做,因为它是一个常量字符*

此外,即使它有效,您的if( tok == "&" )也不起作用,因为 tok 是 char*,而不是字符串,因此您将进行指针而不是内容比较。

您需要使用strcmp()

既然你使用的是字符串,为什么不去破产并使用其他 c++ 结构呢?

stringstream ss(s);
string tmp; 
while (ss >> buf) {
    if( buf == "&" ) background = buf; // one wonders why
    cout << buf << 'n';
}

您的代码将 C++ string s 和 cout s 与 C strtok_r 函数混合在一起。这不是一个好的组合。

错误的直接原因是c_str()返回一个const char *,而strtok()要求一个非常量char *。它想要修改您作为参数传递的字符串,并且不允许你修改c_str()返回的字符串。

如果要执行此 C 样式,请将s切换到 char[]

char s[] = "hello hi here whola";
int background = 0;
char *strval;
char* tok = strtok_r(s, " ", &strval);
while (tok != NULL)
{
    printf("%sn", tok);
    if (strcmp(tok, "&") == 0)
        background = 1;
    else
    {
        statement1;
        statement2;
        ...
    }
    tok = strtok_r(NULL, " ", &strval);
}