我已经阅读了很多关于getchar()
及其行为的问题,但我仍然不理解这个简单的代码..
while (scanf("%d", &z) != 1)
{
while (getchar() != '\n');
printf ("Try again: ");}
这段代码用于验证字符..我从这段代码推断的是,如果我输入
Stackoverflow
然后整行被推到缓冲区,换行符'\ n'也是..
然后getchar()
从缓冲区读取每个字符并返回一个整数,清理缓冲区。在这种情况下,while循环应该循环12次(Stackoverflow中的字符数),直到它到达'\ n'字符。但实际上它只是循环一次而输出是
Try again:
意味着它的循环再次要求scanf
..这违背了我对循环的理解..也许我误解了循环..另外一个问题,如果getchar()
返回整数那么它是怎么回事可以与'\ n'等字符进行比较?
答案 0 :(得分:5)
重新格式化代码以协助我解释:
while (scanf("%d", &z) < 1) {
int c; // for getchar()'s return value
while ((c = getchar()) != EOF && c != '\n')
;
printf ("Try again: ");
}
请注意scanf
会返回成功读取的项目数。 (我改变了外while
条件。)
修改:检查getchar()
的EOF非常重要。循环可以永远旋转。
内部while
之后是分号。这意味着它没有循环体,即除了在所述条件为假之前评估其状态之外什么都不做。
说我输入Stackoverflow
。 scanf
在其格式字符串中看到%d
,查找整数(任意数量的数字,可选地以符号为前缀),找不到任何排序,并返回失败(即0
)不改变z
。
执行进入循环,重复调用getchar
直到找到换行符;这会读取并丢弃所有错误输入。程序打印Try again:
(没有换行符),然后外部循环再次计算其条件,尝试读取整数。
冲洗并重复,直到输入一个整数,此时scanf
将其填入z
并完成循环。
getchar()
(int)与'\n'
( 在C中, char
只是一个较小的int
。 C没有与表示它们的整数概念分开的字符概念。'\n'
是int
,而不是char
,所以这里没有问题。 (这是出于历史原因 - 与K&amp; R C有关。)