繁体   English   中英

c-strtok和while循环终止问题

[英]c - strtok and a while loop termination issue

基本上,每次遇到空白时,我试图将用户输入连接到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");
while(sourceHold != NULL)

循环中的任何内容都不会更改sourceHold

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

确保break条件

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

永远不会遇到,因为strtok'\\0'覆盖'\\n' (如果有的话)。

所以,是的,您有一个无限循环,添加一个check sourceHold[0] != 0应该可以解决该问题。

但是,最好有一个指针

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

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

看一下手册页

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM