繁体   English   中英

scanf不终止

[英]scanf not terminating

因此,我有以下代码(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而不是char才能区分EOF。

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

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

    在此处使用fscanf而不是scanf

在我的情况下,在scanf语句下面的某个地方存在一个无限循环,请删除该无限循环:

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

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

您可能对fscanf()感兴趣,可以从文件中读取内容。

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

暂无
暂无

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

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