【问题标题】:c - strtok and a while loop termination issuec - strtok 和 while 循环终止问题
【发布时间】:2012-11-09 16:47:02
【问题描述】:

基本上,每次遇到空格时,我都会尝试将用户输入连接到 char 数组(源)的数组中。换句话说,如果 sourceHold 包含“祝你生日快乐”,则源的数组内容将为“happy”(在 0)、“birthday”(在 1)、“to”(在 2)、“you”(在3)。 sourcesTag 保存 char 数组数组的当前索引。退出循环时我不断收到错误(代码总是在它完全退出循环之前中断。最后一个“LOOP EXIT”打印行永远不会打印。把它放在那里测试出了什么问题。知道为什么我的循环不会终止吗?我猜测这是因为当整个输入字符串被标记化时,while 语句没有正确终止,但是什么是好的语句呢?

while(sourceHold != NULL)
    {
        if(sourceHold[0] == '\n')
            break;

        printf("%s \n", sourceHold);

        strcpy(sources[sourcesTag], strtok(sourceHold, " "));
        sourcesTag++;

        strcpy( sourceHold, strtok(NULL, "\n"));
    } 
    printf("LOOP EXIT");

【问题讨论】:

    标签: c while-loop strtok


    【解决方案1】:
    while(sourceHold != NULL)
    

    循环中的任何内容都不会改变sourceHold,并且

    strcpy( sourceHold, strtok(NULL, "\n"));
    

    确保breaking 条件

    if(sourceHold[0] == '\n')
    

    从未遇到过,因为strtok 会用'\0' 覆盖'\n'(如果有的话)。

    是的,你有一个无限循环,添加一个检查 sourceHold[0] != 0 应该可以解决这个问题。

    如果有指针会更好

    char *tok = strtok(sourceHold, " ");
    while(tok != NULL) {
        strcpy(sources[sourcesTag++], tok);
        tok = strtok(NULL, " \n");
    }
    

    为了避免可疑的strcpy(sourceHold, strtok(NULL, "\n"));

    【讨论】:

      【解决方案2】:

      看看man page

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

      您需要使用 sourceHold 调用一次,然后所有其他调用都应使用 NULL 调用。也许是这样的:

          strcpy(sources[sourcesTag], 
                 strtok(0 == sourcesTag ? sourceHoldPtr : NULL, " "));
          sourcesTag++;
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-22
        • 2017-09-17
        • 1970-01-01
        • 2017-08-11
        • 1970-01-01
        • 1970-01-01
        • 2015-12-02
        相关资源
        最近更新 更多