测试getchar()== EOF不能按预期工作

我有一个编写“编写一个允许用户输入最多20个整数的C程序的任务(它将停止接受基于哨兵值或基于达到20个整数限制的数字)。程序应该显示数字以相反的顺序进入。“

我决定将我的哨兵值设为“EOF”(或CTRL + D / CRTL + Z)。 我的代码有一些非常不稳定的行为:

  1. 您必须按两次EOF键(这也会创建一个在数组中计算的空白条目。
  2. 第一个条目的第一个数字被截断。

其他一切似乎都行不通,但这显然不是理想的结果。 以下是我的代码。 你能解释一下是什么问题吗?

main() { int i,iMax; double dblMean; int x[MAX]; printf("Please Enter Up to 20 Integers\n"); for (i=0; i ",i+1); if (getchar() == EOF) /* Check for CTRL+D OR CTRL+Z */ break; /* Exit loop if EOF entered :: Must be pressed twice and eats first character of first entry */ scanf("%d",&x[i]); iMax=i; } printf("\nYou entered %d numbers\n",iMax+1); /* Should be i+1 but EOF had to be entered twice */ printf("\nIndex Item Reverse Item\n"); for (i=0; i<=iMax; i++) printf("%3d%4c%8d%9c%11d\n",i,' ',x[i],' ',x[iMax-i]); return 0; 

}

编辑:这是我的最终代码,谢谢大家的帮助:

 #include  #include  #define MAX 20 int main() { int i,iMax; int x[MAX]; printf("Please Enter Up to 20 Integers\n"); for (i=0; i ",i+1); if (scanf("%d",&x[i]) != 1) /* Checks for CTRL+D OR CTRL+Z */ break; /* EOF returns -1 and loop will be exited */ iMax=i; /* iMax must be set for second loop to exit properly */ /* Can sizeof x be used instead for second loop? */ } printf("\nYou entered %d numbers\n",iMax+1); /* Displays number of items entered... Will be <= MAX*/ printf("\nIndex Item Reverse Item\n"); for (i=0; i<=iMax; i++) /* Why wont 'for (i=0; i<=sizeof x; i++)' work? */ printf("%3d%4c%8d%9c%11d\n",i,' ',x[i],' ',x[iMax-i]); return 0; } 

getchar()调用读取(并有效地丢弃)第一个数字,因为它不是EOF。

你没有测试scanf()有效; 你应该。

 for (i = 0; i < MAX; i++) { if (scanf("%d", &x[i]) != 1) break; } 

此时,数组中有i整数; 你真的不需要在循环中设置iMax 。 您可以在循环退出时简单地设置它。

此外,除了检查scanf之外,您还需要了解以下内容: –

EOF不是一个角色。 EOF是getchar()在到达输入结尾或遇到某种错误时返回的宏。 ^ D不是“EOF字符”。 当你在一行上点击^ D时,在linux下发生的事情是它关闭了流,并且getchar()调用到达输入的结尾并返回EOF宏。 如果在行的中间某处键入^ D,则流不会关闭,因此getchar()返回它读取的值,并且循环不会退出。

请参阅http://www.c-faq.com/stdio/getcharc.html以获得更好的描述。