#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]
答案 0 :(得分:8)
s.c_str()
返回指向const char的指针,以防止您修改备份内存。您需要使用strdup()
函数制作此常量字符串的可写副本,因为strtok()
确实会修改您正在扫描令牌的字符串。
答案 1 :(得分:1)
strtok
修改了它的参数。 string.c_str()
不允许这样做,因为它是 const char *
此外,即使它有效,你的if( tok == "&" )
将无效,因为tok是一个char *,而不是一个字符串,因此你将做指针而不是内容比较。
您需要使用strcmp()
既然你正在使用字符串,为什么不去破坏并使用其他c ++结构?
stringstream ss(s);
string tmp;
while (ss >> buf) {
if( buf == "&" ) background = buf; // one wonders why
cout << buf << '\n';
}
答案 2 :(得分:0)
您的代码正在将C ++ string
和cout
与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("%s\n", tok);
if (strcmp(tok, "&") == 0)
background = 1;
else
{
statement1;
statement2;
...
}
tok = strtok_r(NULL, " ", &strval);
}