将字符串转换为常量char

时间:2013-11-27 21:23:18

标签: c++

我正在尝试将我的字符串转换为可以与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()," ,.;-!?@#$%^&");
}

2 个答案:

答案 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字符串要截断。 请注意,此字符串通过分解为较小的字符串(标记)进行修改。 或者,可以指定空指针,在这种情况下,函数继续扫描先前成功调用函数的位置。