所以,我有以下代码(C):
char c = getc(in);
if (c == '(')
...
if (c == '%')
...
if (isdigit(c))
{
int n;
ungetc(c, in);
scanf("%i", &n);
...
}
当我从stdin读取输入时,一切都很好,但是,当从文件中读取输入时,对scanf
的调用不会终止。
我在调用之前添加了一些代码,以便在调用scanf
之前查看正在发生的事情。一个这样的例子是
c = '0'
c
)
ungetc
之后缓冲区是否没有刷新?可能会发生什么,当输入为stdin
时它可以正常工作,但是当它是一个文件时却没有? (我对C中的IO并不熟悉。)
编辑:应该使用fscanf
...男孩脸红了。
答案 0 :(得分:1)
getc()
将返回EOF
到达终点或发生错误
确保你检查一下。你的c
必须是一个int,而不是能够区分EOF的char。
scanf检查它同样如此
EOF的返回值。对于scanf
转换也可能失败,
如果scanf("%i", &n)
应返回1
它成功解析了一些东西
进入n
所以请务必检查
那也是。
您也在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++;
}