【问题标题】:scanf not terminatingscanf没有终止
【发布时间】:2010-09-06 23:25:21
【问题描述】:

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

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

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

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

  1. c = '0'
  2. c 后面的字符是)

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

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

【问题讨论】:

  • getc 的结果存储在char 变量中总是错误的。 getc 返回int。不过,这与您的问题是分开的。

标签: c scanf


【解决方案1】:
  1. getc() 将返回 EOF 到达终点或发生错误所以 确保你检查。您的 c 必须是 int 而不是 char 才能区分 EOF。

  2. scanf 检查其 EOF 的返回值。对于扫描 转换也可能失败, scanf("%i", &n) 应该返回 1 如果 它成功解析了一些东西 进入n,所以一定要检查 1.

  3. 您也在in 上进行操作,如 在getc(in),建议你 从特定的 FILE* 读取, 但是您的 scanf 调用仍然显示 来自标准输入。

    在那里使用fscanf 而不是scanf

【讨论】:

  • 我已经确认getcungetc 都是成功的,并且c 绝对是一个可以作为数字扫描回来的数字。我无法检查scanf 的返回值,因为它不会终止。 (当我在调试器中中断程序时,它在__kernel_vsyscall__ 中被杀死。)
  • 您仍然可以编写代码来检查 scaf 的返回值。查看编辑,当您可能想要从文件中读取时,您正在使用 scanf 从标准输入中读取。
【解决方案2】:

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

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

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

【讨论】:

    【解决方案3】:

    在我的例子中,scanf 语句下方有一个无限循环,请移除无限循环:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多