如何在 C 中使用 EOF stdin

how use EOF stdin in C

提问人:Trung Nguyen 提问时间:11/11/2011 最后编辑:gregwhitakerTrung Nguyen 更新时间:8/24/2015 访问量:41688

问:

我需要将坐标输入到数组中,直到遇到 EOF,但我的代码出了点问题。我用了ctrl + Z,ctrl + D

int main()
{
    int x[1000],y[1000];
    int n=0,nr=0,a,b,i;
    printf("Enter the coordinates:\n");
    while(scanf ( "%d %d ", &a, &b) == 2)
    {
     x[n]=a;
     y[n]=b;
     n++;
    }
    if (!feof(stdin))
    {
       printf("Wrong\n");
    }
    else
    {
       for(i=0;i<n;i++)
       printf("%d %d\n", x[i], y[i]);
    }

  return 0;
}
c stdin scanf feof

评论

1赞 Pushan Gupta 6/8/2017
错误总是打印出来吗?

答:

19赞 Basile Starynkevitch 11/11/2011 #1

我建议使用

while(!feof(stdin) && scanf ( "%d %d ", &a, &b) == 2)

实际上,最好在一些输入操作之后(而不是之前)测试feof,所以:

while (scanf("%d %d ", &a, &b) == 2 && !feof(stdin))

顺便说一句,在许多系统上是缓冲的,至少使用交互式终端(但当 stdin管道时可能不是(7)),参见 setvbuf(3)stdin

在 Linux 和 POSIX 上,你可以考虑使用 getline(3) 读取每一行(如果从终端读取,甚至可以使用 readline(3),因为提供了编辑功能),然后使用 sscanf(3) 解析该行(也许也使用 )或 strtol(3) readline%n

3赞 christop 5/9/2012 #2

我在您的代码中看到的唯一真正的问题是格式字符串中的额外空格。这些空格告诉在输入上使用空格字符,这使得在代码命中非空格字符(例如字母、数字、标点符号或 EOF)之前不会返回到代码。scanfscanfscanf

结果是,在键入两个数字之后,您必须在 DOS/Windows 中键入 - (- ) 两次,然后程序才能逃脱循环。EnterCtrlDCtrlZwhile