如何在C中使用EOF stdin

我需要将坐标输入到数组中,直到遇到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; } 

我建议使用

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

实际上最好 (之前没有!)某些输入操作之后测试feof ,所以:

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

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

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

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

结果是在输入两个数字然后输入后 ,您必须在程序转义while循环之前两次键入CtrlD (在DOS / Windows中为CtrlZ )。