用strtok拆分后,大部分字符串都消失了?

时间:2012-08-14 17:50:09

标签: c++ string token strtok

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;

5 个答案:

答案 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)

正如documentation of strtok所述:

  

然后strtok()函数从那里搜索一个字节   包含在当前分隔符字符串中。如果没有找到这样的字节,   当前令牌延伸到s1指向的字符串的末尾,   随后对令牌的搜索应返回空指针。如果   找到这样一个字节,它被空字节覆盖,其中   终止当前令牌。 strtok()函数保存指针   下一个字节,下一次搜索令牌   启动。

这意味着当你打印字符串时,打印它的函数在经过第一个标记并遇到空字符后停止。 NULL通常表示C字符串的“字符串结尾”。

答案 4 :(得分:0)

strtok()的工作方式是用字符串结束符替换分隔符。所以“嘿,你好吗?”成为“嘿,\ 0how \ 0are \ 0you?”

这是您通常不应该使用strtok()的一个原因。第二个原因是它以迭代方式工作并存储有关字符串的信息,以便在进一步调用strtok()时使用。如果您从多个线程使用它,信息将被覆盖,并且进一步的调用将无法正常工作。