我正在尝试将我的字符串转换为可以与strtok函数一起使用的const字符。我究竟做错了什么?
int _tmain(int argc, _TCHAR* argv[])
{
char * pointer_char;
int pos = 0;
std::string str = " Hello good sirtttttt..!.";
int i = 0;
int length = str.length();
const char * cstr = str.c_str();
cout << "Testing string is " << str << endl << endl;
pointer_char = strtok (str.c_str()," ,.;-!?@#$%^&");
}
答案 0 :(得分:5)
请勿直接将.c_str()
结果与strtok
一起使用。
strtok
需要char*
不是常量,它会尝试更改传递的字符串。由于您传递的字符串来自const char*
,因此无法更改它。如果在将其传递给此函数之前尝试将其强制转换为非const类型,则将调用未定义的行为。
您需要制作副本,然后将该副本传递给strtok
,例如:
char *c = strdup(str.c_str()); // It's not standard but simple to write
pointer_char = strtok(c," ,.;-!?@#$%^&");
free(c);
尽量不要在C ++中特别使用strtok
(你有很多选择),它不是线程安全的。
答案 1 :(得分:2)
strtok
不会将const char *
作为char*
的第一个参数。字符串必须是可修改的。
char *strtok (char *str, const char *delimiters);
str
C字符串要截断。
请注意,此字符串通过分解为较小的字符串(标记)进行修改。
或者,可以指定空指针,在这种情况下,函数继续扫描先前成功调用函数的位置。