2

我有一个任务是“编写一个允许用户输入最多 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<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;

}

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

#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;
}
4

2 回答 2

1

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

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

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

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

于 2012-10-22T05:08:41.697 回答
0

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

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

有关详细说明,请参见http://www.c-faq.com/stdio/getcharc.html

于 2012-10-22T05:42:08.007 回答