strtok添加额外的一行?

时间:2019-06-06 01:05:41

标签: c strtok

我在阅读和使用strtok功能拆分多行用户输入时遇到麻烦。我需要按它们之间的空格进行拆分,但是我认为strtok会继续添加额外的一行?

例如:

用户将粘贴以下文本块:

324 A 1 D F

829 Z 3 3 F G

1234 C 3 F G

234 D 2 3

当我打印令牌的输出时,它向我显示:

324 A 1 D F

829 Z 3 3 F G

1234 C 3 F G

<---按下Enter键后生成随机新行--->

234 D 2 3。 <-仅在随机线生成后显示。


将第1行到第3行粘贴到控制台后,立即将其打印到控制台中。 按下回车键后,将在它们之间插入新行,最后打印最后一行。然后我必须再次按Enter键才能结束程序。

这是我的代码:

int main(void) {
char input[256];
int done = 1;
while (done!=0){
        fgets(input,256,stdin);
        char* t;
        printf("\n");

        t=strtok(input, " \n");

        if (*t == '\n'){
            done = 0;
        } else{
            while (t!= NULL){
                printf("%s " ,t);
                t = strtok(NULL, " \n");
            }
        }
    }
}

1 个答案:

答案 0 :(得分:1)

IO操作的第一条规则:从不假定它们成功。

  1. 来自fgets的未经检查的结果。
  2. 如果您strok停(终止于)空格或换行符,则您如何期望*t指向换行符。因此done = 0;永远不会命中。因此,您跳入了您从未检查过的失败的fgets通话中,等等。

代码

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

int main() 
{
    char input[256];

    // check for failure to read, on a line with newline first
    while (fgets(input, 256, stdin) != NULL && *input != '\n')
    {
        char *t = strtok(input, " \n");
        while (t != NULL) 
        {
            printf("%s ", t);
            t = strtok(NULL, " \n");
        }
        fputc('\n', stdout);
    }
}

输入

324 A 1 D F
829 Z 3 3 F G
1234 C 3 F G
234 D 2 3

输出

324 A 1 D F 
829 Z 3 3 F G 
1234 C 3 F G 
234 D 2 3 

See it live on ideone.com