C语言中EOF的检测

fsi0uk1n  于 2022-12-22  发布在  其他
关注(0)|答案(6)|浏览(231)

我使用下面的C代码从用户那里获取输入直到EOF发生,但是问题是这个代码不工作,它在获取第一个输入后终止。这个代码有什么问题?

float input;
 
printf("Input No: ");
scanf("%f", &input);
    
while(!EOF)
{
    printf("Output: %f", input);
    printf("Input No: ");
    scanf("%f", &input);
}
a64a0gku

a64a0gku1#

EOF只是一个带有值(通常为-1)的宏,您必须针对EOF测试某些内容,例如getchar()调用的结果。
测试流结束的一种方法是使用feof函数。

if (feof(stdin))

注意,“流结束”状态仅在读取失败设置。
在您的示例中,您可能应该检查scanf的返回值,如果这表明没有读取任何字段,则检查文件尾。

w80xi6nr

w80xi6nr2#

EOF是C语言中的一个常量。您并不是在检查实际文件是否存在EOF。您需要执行以下操作

while(!feof(stdin))

这里是feof的文档。你也可以检查scanf的返回值。它返回成功转换的项数,或者EOF,如果它到达文件的结尾。

lzfw57am

lzfw57am3#

另一个问题是你只能用scanf("%f", &input);阅读。如果用户输入了一些不能被解释为C浮点数的东西,比如“pi”,scanf()调用不会给input赋值,也不会从那里继续。这意味着它会试图继续读取“pi”,并且失败。
考虑到while(!feof(stdin))的更改,其他海报也正确地推荐了这一更改,如果您键入“pi”,则会出现打印input以前的值和打印提示符的无限循环,但程序永远不会处理任何新的输入。
scanf()返回它对输入变量赋值的次数,如果没有赋值,就意味着它没有找到浮点数,你应该用char string[100];scanf("%99s", string);这样的字符串来读取更多的输入,这样会从输入流中删除下一个字符串(最多99个字符--额外的char用于字符串的空终止符)。
你知道,这提醒了我讨厌scanf()的所有原因,以及为什么我使用fgets()代替,然后可能使用sscanf()解析它。

ifmq2ha2

ifmq2ha24#

作为起点,您可以尝试替换

while(!EOF)

while(!feof(stdin))
yeotifhr

yeotifhr5#

您希望检查scanf()的结果以确保转换成功;如果没有,那么只有三种可能:

  1. scanf()阻塞了对% f转换说明符无效的字符(即,数字、点、"e"或"E"以外的字符);
  2. scanf()已检测到EOF;
  3. scanf()在读取标准输入时检测到错误。
    示例:
int moreData = 1;
...
printf("Input no: ");
fflush(stdout);
/**
 * Loop while moreData is true
 */
while (moreData)
{
  errno = 0;
  int itemsRead = scanf("%f", &input);
  if (itemsRead == 1)
  {
    printf("Output: %f\n", input);
    printf("Input no: ");
    fflush(stdout);
  }
  else
  {
    if (feof(stdin))
    {
      printf("Hit EOF on stdin; exiting\n");
      moreData = 0;
    }
    else if (ferror(stdin))
    {
      /**
       * I *think* scanf() sets errno; if not, replace
       * the line below with a regular printf() and
       * a generic "read error" message.
       */
      perror("error during read");
      moreData = 0;
    }
    else
    {
      printf("Bad character stuck in input stream; clearing to end of line\n");
      while (getchar() != '\n')
        ; /* empty loop */
      printf("Input no: ");
      fflush(stdout);
    }
 }
dffbzjpn

dffbzjpn6#

while(scanf("%d %d",a,b)!=EOF)
{

//do .....
}

相关问题