2010-09-06 108 views
0

所以,我有下面的代码(C):scanf函数不会终止

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 ......男孩是我的脸红。

+2

存储getc'的'结果在'char'变量始终是错误的。 'getc'返回'int'。不过,这与你的问题是分开的。 – 2010-09-06 23:32:20

+0

感谢您的提示。 – Pete 2010-09-06 23:36:59

回答

1
  1. getc()将返回EOF当你01​​到达终点或发生错误,所以 确保您检查。你的c必须是一个整数,而不是一个字符能够区分EOF。

  2. 这同样适用于scanf检查其 EOF的返回值。对于scanf 转换也可能失败, scanf("%i", &n)应返回1如果 它成功地分析 到n因此请确保您也检查 太1。

  3. 你也在getc(in)操作上in,如 ,提示你 从一个特定的文件*阅读,但是 您scanf函数调用仍然读取从标准输入 。

    在那里使用fscanf而不是scanf

+0

我已经确认'getc'和'ungetc'都是成功的,'c'肯定是一个可以作为数字被扫描回来的数字。我无法检查'scanf'的返回值,因为它没有终止。 (当我在调试器中断程序时,它在'__kernel_vsyscall__'中被终止。) – Pete 2010-09-06 23:34:34

+0

尽管你仍然可以编写代码来检查scaf的返回值。看到编辑,你可能想要从文件读取时使用scanf从标准输入读取。 – nos 2010-09-06 23:36:54

+0

啊!很明显...谢谢。 – Pete 2010-09-06 23:37:56

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); 
    ... 
} 
0

在我的情况有一个无限循环低于scanf函数声明的地方,除去无限循环:

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