我有一个分配给“写一个允许用户输入最多20个整数的C程序(它将停止接受基于哨兵值或基于达到20个整数限制的数字)。然后程序应该以相反的顺序显示数字。“
我决定将我的哨兵值设为“EOF”(或CTRL + D / CRTL + Z)。我的代码有一些非常不稳定的行为:
其他一切似乎都运转不错,但这显然不是理想的结果。以下是我的代码。你能解释一下是什么问题吗?
main() {
int i,iMax;
double dblMean;
int x[MAX];
printf("Please Enter Up to 20 Integers\n");
for (i=0; i<MAX; i++)
{
printf("%d.> ",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;
}
EDITED: 这是我的最终代码,谢谢大家的帮助:
#include <stdio.h>
#include <stdlib.h>
#define MAX 20
int main()
{
int i,iMax;
int x[MAX];
printf("Please Enter Up to 20 Integers\n");
for (i=0; i<MAX; i++)
{
printf("%d.> ",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;
}
答案 0 :(得分:1)
getchar()
来电读取(并有效丢弃)第一个数字,因为它不是EOF。
你没有测试scanf()
是否有效;你应该。
for (i = 0; i < MAX; i++)
{
if (scanf("%d", &x[i]) != 1)
break;
}
此时,数组中有i
个整数;你真的不需要在循环中设置iMax
。你可以在循环退出时简单地设置它。
答案 1 :(得分:0)
此外,除了检查scanf之外,您还需要了解以下内容: -
EOF不是角色。 EOF是getchar()在到达输入结尾或遇到某种错误时返回的宏。 ^ D不是“EOF字符”。当你在一行上点击^ D时,在Linux下发生的事情是它关闭了流,并且getchar()调用到达输入的结尾并返回EOF宏。如果在行的中间某处键入^ D,则流不会关闭,因此getchar()返回它读取的值,并且循环不会退出。
请参阅http://www.c-faq.com/stdio/getcharc.html以获得更好的说明。