c++ strtok in函数将原始字符串值更改为参数
c++ strtok in function changes original string value as parameter
当我使用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().相关文章:
- 如何使用Luacneneneba API正确读取字符串和表参数
- 如何使用字符串文字作为宏参数
- 如何将可变长度参数联接为字符串
- 如何使用字符串find_first_of缓冲区形式(size_t n 参数)
- 具有字符串化的可变参数宏的现代/通用方法
- C++ 构造函数参数:字符串、整数、整数、整数
- 当C 中的系统调用conconculables时,参数字符串中的字符损失
- 模板参数字符串与整数
- #define 参数字符串化,但宽字符串 L " instead of "
- std::getline 用于 ifstream,使用参数字符串或 char *
- 通过参数字符串化宏调用模板函数
- 可变参数字符串比较
- 为什么位集的构造函数有参数字符串::charT 零,字符串::charT one)
- c++中stdbind在带有参数(字符串)的函数中的用法
- 当使用字符变量作为参数(字符串转换为字符)时,Std::rename()文件将不起作用
- C/ c++预处理器中的宏参数字符串化为宽字符串字面值
- 如何比较Visual C++中的参数字符串
- C++错误:推断出参数'T'字符串与常量字符的冲突类型 *
- 传递参数字符串,其中包含空格和引号
- 函数参数字符串通过引用传递