【问题标题】:Very basic strtok program misusing delimiters - C非常基本的 strtok 程序滥用分隔符 - C
【发布时间】:2018-03-28 06:22:38
【问题描述】:

这是我的程序(用 C 编写,在 Omega 上编译和运行,如果有什么不同的话):

#include <stdio.h>
#include <string.h>

int main (void)
{
    char string[] = " hello!how are you? I am fine.";
    char *token = strtok(string,"!?.");

    printf("Token points to '%c'.\n",*token);

    return 0;
}

这是我期待的输出:

"Token points to '!'."

但我得到的输出是:

"Token points to ' '."

通过反复试验,我知道这是指字符串中的第一个字符:“hello!”之前的空格。

为什么我没有得到我期望的输出,我该如何解决?从我在这里读到的内容中,我确实明白 strtok 最好埋在沟里,但让我们假设(如果可能的话)我必须在这里使用它,并且我必须让它工作。

【问题讨论】:

  • 也许您应该阅读更多关于strtok 及其返回的信息?也许你想要strpbrk 代替?
  • ...以及它的作用。
  • 哦,永远不要忘记总是检查NULL指针返回。
  • 使用strpbrk() 而不是strtok()

标签: c delimiter strtok


【解决方案1】:

根据strtok 手册页描述

strtok() 函数将字符串解析为标记序列。在 第一次调用 strtok() 应指定要解析的字符串 在海峡在应解析相同字符串的每个后续调用中,str 应该为 NULL。

它根据分隔符解析字符串并返回字符串而不是分隔符。

在您的情况下,分隔符是"!?."

char string[] = " hello!how are you? I am fine.";

分隔符"!" 匹配字符串" hello" 之后的第一次出现。所以它将返回" hello" 作为strtok 的返回。而您的输出只不过是" hello" 字符串的第一个字符' '

【讨论】:

    【解决方案2】:

    有人刚刚发布了答案。它对我有用,现在我找不到它。我记得最好重新发布,以防其他人有同样的问题。

    char *token = strtok(string,"!?.");
    token = strtok(NULL, "!?."); //<--THIS
    

    token 指向第一个分隔符之后的第一个字母,这至少是我可以使用的。谢谢陌生人!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多