%d
扫描非整数时,fscanf
会一直失败,直到将非整数字符从输入流中明确删除为止。尝试扫描a123
将失败,直到将a
从输入流中删除为止。尝试扫描
------123
也会失败(fscanf
返回0
),但-
已经从输入流中删除了。这是
fscanf
的正确行为吗?文件包含
----------123
,执行此代码的结果为:#include <stdio.h>
int main(void) {
int number = 0;
int result = 0;
FILE *pf = NULL;
if (NULL != (pf = fopen("integer.txt", "r"))) {
while (1) {
if (1 == (result = fscanf(pf, "%d", &number))) {
printf("%d\n", number);
} else {
if (EOF == result) {
break;
}
printf("result is %d\n", result);
}
}
fclose(pf);
}
return 0;
}
是:
result is 0
result is 0
result is 0
result is 0
result is 0
result is 0
result is 0
result is 0
result is 0
-123
如果文件包含
a123
,结果将会是一个无限循环。在我看来,这种行为似乎是不一致的。是吗?
scanf
实现,这是一个“不可能”的情况。你已经读取了第一个-
,它可能是负整数的开头。然后你读取了第二个-
,它不是数字,这意味着你的扫描失败了。你可以将第二个-
推回去,但是ungetc
只保证一个字符的推回。所以推回第一个-
可能很困难或不可能。我怀疑这就是为什么你看到它被消耗掉的原因。 - Steve Summitman ungetc
)。 - Steve Summitungetc()
放回任何字符,它不一定是之前读取的那个字符。 - Jonathan Leffler*scanf()
不能使用ungetc()
。那一个字节的ungetc()
是保留给用户的。必须有一个第二个字节的“内部ungetc()
”用于*scanf()
,并且库实现不能混淆它们...;-) - DevSolar