1

基本上我试图在每次遇到空格时将用户输入连接到一个字符数组(源)数组中。换句话说,如果 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");
4

2 回答 2

5
while(sourceHold != NULL)

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

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

确保breaking 条件

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

从来没有遇到过,因为用astrtok覆盖'\n'(如果有的话)'\0'

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

但是,最好有一个指针

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

避免半信半疑strcpy(sourceHold, strtok(NULL, "\n"));

于 2012-11-09T16:49:00.820 回答
0

看看手册页

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

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

    strcpy(sources[sourcesTag], 
           strtok(0 == sourcesTag ? sourceHoldPtr : NULL, " "));
    sourcesTag++;
于 2012-11-09T17:11:34.703 回答