scanf没有终止

时间:2010-09-06 23:25:22

标签: c 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 )
  3. 之后的角色

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

    编辑:应该使用fscanf ...男孩脸红了。

3 个答案:

答案 0 :(得分:1)

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

  2. scanf检查它同样如此 EOF的返回值。对于scanf 转换也可能失败, 如果scanf("%i", &n)应返回1 它成功解析了一些东西 进入n所以请务必检查 那也是。

  3. 您也在in上操作 在getc(in),暗示你是 从特定的文件中读取*, 但是你的scanf调用仍在读取 来自stdin。

    使用fscanf代替scanf

答案 1 :(得分:0)

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

您可能更感兴趣的是fscanf()从您的文件中读取。

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

答案 2 :(得分:0)

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

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