【问题标题】:Most of string gone after splitting with strtok?用strtok拆分后大部分字符串都消失了吗?
【发布时间】:2012-08-14 17:50:08
【问题描述】:

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;

【问题讨论】:

  • 试试man strtok并获取基本信息。
  • 为什么不是 Zoidb...^H^H^H^H^H^H^H^H^H std::stringstd::stringstream

标签: c++ string token strtok


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    strtok() 通过在找到令牌时插入'\0' 来更改其操作的字符串。

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

    【讨论】:

      【解决方案3】:

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

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

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

          【解决方案5】:

          正如documentation of strtok 所说:

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

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-01-21
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-04-07
            • 2020-05-24
            相关资源
            最近更新 更多