e:谢谢大家,没有意识到strtok实际上修改了字符串本身。希望我以后不会那么笨了。
最近,我开始从一本书中学习C++。我现在在关于解析字符串的章节中。
我的下一个任务是将字符串的标记与strtok拆分后重新组合在一起,但是我不知道字符串的其余部分在第一个分隔符之后的位置!记住,我对这件事很陌生,如果这是个愚蠢的问题,我很抱歉。
基本上是这样的: 1。我输入了一个字符串“嗨,你好吗?”2。打印出来,正常的。3.然后我将其拆分为标记(使用分隔符和空格) 4。它们都整齐地打印5。再次打印字符串,剩下的就是“嘿嘿”。
那我怎么把剩下的绳子拿回来呢?
这是我的密码:
char the_string[ 81], *p;
cout << the_string << endl;
cout << "Input a string to parse: ";
cin.getline(the_string, 81);
p = strtok(the_string, ", ");
while (p != NULL) {
cout << p << endl;
p = strtok(NULL, ", ");
}
cout << the_string << endl;发布于 2012-08-14 17:53:02
strtok()修改它所操作的字符串:
如果str != NULL,则函数将搜索第一个不是分隔符的字符。这个字符是标记的开始。然后,函数搜索第一个分隔符。这个字符是令牌的结尾。如果在找到令牌结束之前遇到str的结束,则函数终止并返回NULL。否则,指向令牌结束的指针将保存在静态位置,以便进行后续调用。这个字符然后被一个空字符替换,函数返回一个指向令牌.开头的指针。
在传递到strtok()之前,复制字符串。
在C++中有更好的方法来实现这一点,但是由于这听起来像是家庭作业,所以您可能不被允许使用它们。
发布于 2012-08-14 17:53:52
strtok()通过在找到令牌时插入'\0'来更改它所操作的字符串。
因此,字符串"one two three\0" (显式'\0' for reference)在被空格标记时被更改为"one\0two\0three\0",大多数字符串操作将其视为"one" (我现在已经删除了'\0' )。
发布于 2012-08-14 17:53:59
下次使用函数时,请阅读它的手册页(更仔细)。Strtok()通过用null字符替换分隔符的第一个字符来标记字符串。您的字符串最终被修改为。类似的内容(\0表示NUL char):
Hey\0 how\0 are\0 you?\0在将字符串传递给strtok()之前,先进行Str凭着()。
https://stackoverflow.com/questions/11957901
复制相似问题