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

时间:2012-10-22 05:04:22

标签: c arrays eof getchar

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

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

  1. 您必须按两次EOF键(这也会创建一个在数组中计算的空白条目。
  2. 第一个条目的第一个数字被截断。
  3. 其他一切似乎都运转不错,但这显然不是理想的结果。以下是我的代码。你能解释一下是什么问题吗?

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

2 个答案:

答案 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以获得更好的说明。