c++ strtok in函数将原始字符串值更改为参数

c++ strtok in function changes original string value as parameter

本文关键字:参数 字符串 原始 strtok in 函数 c++      更新时间:2023-10-16

当我使用strtok对c++字符串进行标记时,会出现一个令人困惑的问题,请参阅下面的简单代码:

void a(string s){
    strtok((char*)s.c_str(), " ");
}
int main(){
    string s;
    s = "world hello";
    a(s);
    cout<<s<<endl;
    return 0;
}

程序输出"world"。它不应该输出"world hello"吗?因为我将字符串作为值参数传递给函数a,所以strtok不应该修改原始的s…有人能解释一下这个把戏吗?谢谢你。

问题是(char*)s.c_str(),您正在抛弃constness并以一种您不应该的方式修改string内容。而原来的s不应该被修改,我认为你可能已经击中了一个聪明的优化,希望你玩的规则。例如,string的COW实现会碰巧显示这种行为。

c_str()返回一个const指针,这是对编译器的一个承诺,即指向的东西不会被修改。然后你调用strtok它会修改它

当你对编译器撒谎时,你会受到惩罚。

strtok()就是这样工作的。它使用第一个参数作为缓冲区。通过将其转换为char*,您允许它修改字符串。Strtok()不知道原始std::string。它还将字符串指针存储在静态变量中,这就是为什么下次必须使用空指针调用它以继续解析相同的字符串。

顺便说一下,在c++中,你应该使用std::istringstream。它不使用内部静态变量,这不是线程安全的。你可以直接将参数提取为int, double,等等,就像我们对cin所做的那样。Std::ostringstring replace sprintf().