scanf没有终止

所以,我有以下代码(C):

char c = getc(in); if (c == '(') ... if (c == '%') ... if (isdigit(c)) { int n; ungetc(c, in); scanf("%i", &n); ... } 

当我从stdin读取输入时,一切都很好,但是,当从文件中读取输入时,对scanf的调用不会终止。

我在调用周围添加了一些代码,看看在调用scanf之前发生了什么。 一个这样的例子是

  1. c = '0'
  2. c之后的人物是)

ungetc之后缓冲区是否没有冲洗? 可能会发生什么,当输入是stdin时它工作正常但是当它是一个文件时它没有? (我对C中的IO并不熟悉)。

编辑:应该使用fscanf …男孩是我的脸红。

  1. 当你到达终点或发生错误时, getc()将返回EOF,因此请确保检查该错误。 你的c必须是一个int,而不是能够区分EOF的char。

  2. scanf检查其EOF的返回值也是如此。 对于scanf,转换也可能失败,如果成功地将某些内容解析为n ,则scanf("%i", &n)应返回1,因此请确保检查该内容。

  3. 您也在运行,如在getc(in) ,建议您从特定的FILE *读取,但是您的scanf调用仍然从stdin读取。

    在那里使用fscanf而不是scanf

scanf()将从stdin文件描述符中获取输入。 如果重定向,则将从适当的来源获取。 getc()将从任何文件描述符中读取。 你正在混合来自文件和标准输入的输入。

您可能对fscanf()更感兴趣,以便从您的文件中读取。

 char c = getc(in); if (c == '(') ... if (c == '%') ... if (isdigit(c)) { int n; ungetc(c, in); fscanf(in, "%i", &n); ... } 

在我的情况下,scanf语句下面有一个无限循环,删除无限循环:

 unsigned long x,y; scanf("%llu%llu",&x,&y); while(i<=4) { if(list[i]>=x && list[i]<=y) count++; //i++; }