繁体   English   中英

测试getchar()== EOF无法正常工作

[英]Testing getchar() == EOF doesn't work as expected

我的一项作业是“写一个C程序,该程序允许用户输入最多20个整数(它将停止接受基于前哨值或达到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;
}

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

您无需测试scanf()有效; 你应该。

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

此时,数组中有i整数; 您实际上不需要在循环中设置iMax 您可以在循环退出时简单地进行设置。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM