e:谢谢大家,没有意识到strtok实际上修改了字符串本身。希望将来我不那么愚蠢。
我最近从书中学习了C ++。我现在在关于解析字符串的章节。
我的下一个任务是在用strtok拆分后将字符串的标记重新组合在一起,但我不明白字符串的其余部分在第一个分隔符之后的位置!请记住,我对此很新,很抱歉,如果这是一个愚蠢的问题。
基本上发生的事情是这样的: 我输了一个字符串“嘿,你好吗?” 打印出来,正常。 然后我将它分成标记(使用分隔符和空格) 他们都整齐地打印出来 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;
答案 0 :(得分:4)
strtok()
修改其运行的字符串:
如果str!= NULL,则该函数搜索不是分隔符的第一个字符。此字符是令牌的开头。然后该函数搜索第一个分隔符。此字符是令牌的结尾。如果在找到令牌结束之前遇到str的结尾,则函数终止并返回NULL。否则,指向令牌结尾的指针将保存在静态位置,以便进行后续调用。 然后用NULL字符替换此字符,函数返回指向标记开头的指针。
在传递给strtok()
之前复制字符串。
有更好的方法可以在C ++中实现这一点,但这听起来像是家庭作业,你可能不被允许使用它们。
答案 1 :(得分:4)
strtok()
会在找到令牌时插入'\0'
来更改其操作的字符串。
因此,当用空格标记时,字符串"one two three\0"
(显式'\0'
作为参考)变为"one\0two\0three\0"
,大多数字符串操作将其视为"one"
(I '现已删除了'\0'
答案 2 :(得分:0)
下次使用某个功能时,请阅读其手册页(更仔细)。 Strtok()通过用空字符替换分隔符的第一个字符来标记字符串。 您的字符串最终被修改。这样的事情(\ 0表示NUL字符):
Hey\0 how\0 are\0 you?\0
在将字符串传递给strtok()之前strdup()。
答案 3 :(得分:0)
然后strtok()函数从那里搜索一个字节 包含在当前分隔符字符串中。如果没有找到这样的字节, 当前令牌延伸到s1指向的字符串的末尾, 随后对令牌的搜索应返回空指针。如果 找到这样一个字节,它被空字节覆盖,其中 终止当前令牌。 strtok()函数保存指针 下一个字节,下一次搜索令牌 启动。
这意味着当你打印字符串时,打印它的函数在经过第一个标记并遇到空字符后停止。 NULL通常表示C字符串的“字符串结尾”。
答案 4 :(得分:0)
strtok()的工作方式是用字符串结束符替换分隔符。所以“嘿,你好吗?”成为“嘿,\ 0how \ 0are \ 0you?”
这是您通常不应该使用strtok()的一个原因。第二个原因是它以迭代方式工作并存储有关字符串的信息,以便在进一步调用strtok()时使用。如果您从多个线程使用它,信息将被覆盖,并且进一步的调用将无法正常工作。