【问题标题】:In C - While Loop Exit issue during usage of strtok在 C 中 - 使用 strtok 期间的 While 循环退出问题
【发布时间】:2020-07-08 04:01:20
【问题描述】:

我尝试使用 strtok 拆分字符串并将单个单词存储在 2D 数组中。我已经放置了 printf 语句并检查了单个单词是否正在被存储,并且看到单词正在被存储。 但问题是 while 循环根本不会终止,而执行它时不会打印退出语句“Hi”。 我在这里找不到错误。 有人可以帮我解决这个问题吗?

int wordBreak(char* str, char words[MAX_WORDS][MAX_WORD_LENGTH])
{
    int x=0;
    const char  *delimiters = " :,;\n";
    char* token = strtok(str,delimiters);
    strcpy(words[x],token);
    x++;
    while(token!=NULL) {
        token = strtok(NULL,delimiters);
        strcpy(words[x],token);
        x++;
    }
    printf("Hi\n");
    return x;
}

【问题讨论】:

  • 如果char* token = strtok(str,delimiters); 返回NULL 会发生什么?你有几件事不正常。删除第一个strcpy(words[x],token);x++; 并将token = strtok(NULL,delimiters); 移动到循环的末尾。
  • 感谢 David C. Rankin。我做了你指定的更改,代码现在运行良好......
  • 不客气——请记住,在编程中,尤其是在 C 语言中,您需要验证对程序持续运行至关重要的每个值或输入。每个函数的手册页都提供了关于正确使用、返回和错误条件的简明信息,您应该检查(一开始它们有点神秘 - 但您会意识到它们实际上是多么简洁和好)你的编码!

标签: c while-loop infinite-loop strtok


【解决方案1】:

在调用strcpy 复制到您的数组之前,您必须始终确保strtok 的返回不是NULL。一个简单的重新排列将确保是这种情况:

int wordBreak (char* str, char words[MAX_WORDS][MAX_WORD_LENGTH])
{
    int x = 0;
    const char *delimiters = " :,;\n";
    char *token = strtok (str,delimiters);
    
    while (x < MAX_WORDS && token != NULL) {
        if (strlen (token) < MAX_WORD_LENGTH) {
            strcpy (words[x++], token);
            token = strtok (NULL, delimiters);
        }
        else
            fprintf (stderr, "warning: token '%s' exeeded MAX_WORD_LENGTH - skipped\n",
                     token);
    }
    
    return x;
}

您还必须通过添加如上所示的附加条件来确保x &lt; MAX_WORDS,并在复制到您的数组之前进行测试以确保strlen(token) &lt; MAX_WORD_LENGTH

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-12
    • 2015-01-18
    • 2018-03-18
    • 1970-01-01
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多