0

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;
4

5 回答 5

4

strtok()修改它所操作的字符串:

如果 str != NULL,该函数搜索不是分隔符的第一个字符。这个字符是令牌的开始。然后该函数搜索第一个分隔符。这个字符是令牌的结尾。如果在找到标记结尾之前遇到 str 结尾,则函数终止并返回 NULL。否则,指向令牌末尾的指针将保存在静态位置以供后续调用。然后这个字符被一个 NULL 字符替换,函数返回一个指向标记开头的指针。

在传递给之前复制字符串strtok()

在 C++ 中有更好的方法来实现这一点,但是这听起来像是家庭作业,你可能不允许使用它们。

于 2012-08-14T17:53:02.217 回答
4

strtok()'\0'每当找到标记时插入 a 来更改它所操作的字符串。

因此,字符串"one two three\0"(显式'\0'以供参考),当被空格标记时,被更改为"one\0two\0three\0"并且大多数字符串操作将其视为"one"(我已经删除了'\0'现在)

于 2012-08-14T17:53:52.520 回答
0

下次使用函数时,请阅读其手册页(更仔细)。Strtok() 通过将分隔符的第一个字符替换为空字符来标记字符串。您的字符串最终被修改。像这样的东西(\0 表示 NUL 字符):

Hey\0 how\0 are\0 you?\0

strdup() 将字符串传递给 strtok() 之前的字符串。

于 2012-08-14T17:53:59.763 回答
0

正如strtok 的文档所述:

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

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

于 2012-08-14T17:54:00.380 回答
0

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

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

于 2012-08-14T18:02:05.627 回答