你怎么读C中的scanf直到EOF?

时间:2010-09-21 20:03:51

标签: c scanf eof

我有这个,但是一旦达到假定的EOF,它就会重复循环并再次扫描。

int main(void)
{
        char words[16];

        while(scanf("%15s", words) == 1)
           printf("%s\n", words);

        return 0;
}

7 个答案:

答案 0 :(得分:20)

尝试:

while(scanf("%15s", words) != EOF)

您需要将scanf输出与EOF

进行比较

由于您在格式字符串中指定宽度15,因此您最多只能读取15个字符。因此,char数组的大小应为1615 +1 null的大小char words[16]; 。所以声明为:

{{1}}

答案 1 :(得分:4)

Scanf几乎总是比它的价值更麻烦。以下是两种更好的方法来做你想做的事情。第一个是对代码的或多或少的直接翻译。它更长,但你可以看一下它,看清楚它的作用,与scanf不同。

#include <stdio.h>
#include <ctype.h>
int main(void)
{
    char buf[1024], *p, *q;
    while (fgets(buf, 1024, stdin))
    {
        p = buf;
        while (*p)
        {
            while (*p && isspace(*p)) p++;
            q = p;
            while (*q && !isspace(*q)) q++;
            *q = '\0';
            if (p != q)
                puts(p);
            p = q;
        }
    }
    return 0;
}

这是另一个版本。通过检查看到它的作用有点困难,但如果一行超过1024个字符,它就不会中断,所以这是我在生产中使用的代码。 (好吧,真的我将在生产中使用的是tr -s '[:space:]' '\n',但这就是你实现类似的东西。)

#include <stdio.h>
#include <ctype.h>
int main(void)
{
    int ch, lastch = '\0';
    while ((ch = getchar()) != EOF)
    {
        if (!isspace(ch))
            putchar(ch);
        if (!isspace(lastch))
            putchar('\n');
        lastch = ch;
    }
    if (lastch != '\0' && !isspace(lastch))
        putchar('\n');
    return 0;
}

答案 2 :(得分:3)

您的代码循环直到它读取单个单词,然后退出。因此,如果你给它多个单词,它将读取第一个并退出,而如果你给它一个空输入,它将永远循环。无论如何,它只会打印来自未初始化内存的随机垃圾。这显然不是你想要的,但你想要什么?如果您只想阅读并打印第一个单词(如果存在),请使用if:

if (scanf("%15s", word) == 1)
    printf("%s\n", word);

如果您想循环阅读单词,请使用while:

while (scanf("%15s", word) == 1)
    printf("%s\n", word);

另外,正如其他人所指出的那样,你需要给单词数组一个足够大的scanf大小:

char word[16];

其他人建议测试EOF而不是检查scanf匹配的项目数。这种情况很好,其中scanf不能匹配,除非有EOF,但在其他情况下不太好(例如尝试读取整数),其中scanf可能在没有达到EOF的情况下匹配任何内容(如果输入不是'数字)并返回0。

修改

看起来你改变了你的问题以匹配我运行时运行良好的代码 - 循环阅读单词直到达到EOF然后退出。所以你的代码还有其他的东西,或许与你如何按照David的建议提供输入有关。

答案 3 :(得分:0)

您需要针对EOF检查返回值,而不是针对1

请注意,在您的示例中,您还使用了两个不同的变量名称wordsword,仅声明了words,并且没有声明其长度,应该是16到适合读入的15个字符加上NUL个字符。

答案 4 :(得分:0)

伙计,如果您使用的是Windows,则按Enter键不会到达EOF,而是在控制台上按Crtl + Z。这将打印“ ^ Z”,这是EOF的指示。 读取此内容时的功能行为(EOF或Crtl + Z):

Function: Output: scanf(...) EOF gets(<variable>) NULL feof(stdin) 1 getchar() EOF

答案 5 :(得分:-1)

我想最好的办法是......

int main()
{
    char str[100];
    scanf("[^EOF]",str);
    printf("%s",str);
    return 0;     
}

答案 6 :(得分:-4)

对于C用户,这也可以使用

while ( gets(str) != NULL )