我曾经和K&R一起工作,基础部分中它广泛使用 getchar()
函数进行输入。但问题是我无法完全理解其行为。
下面是一段示例代码:
#include <stdio.h>
int main() {
char c,i;
char line[10000];
i = 0;
while((c=getchar()) != EOF && c!= '\n') {
line[i++] = c;
}
printf("%s",line);
}
这段代码的运行符合预期。
我对此有疑问:为什么当我按下回车键时,程序就终止了?它是如何知道换行是终止条件的,而我还在输入并且程序停留在c=getchar()
?
我知道这不是像scanf()
那样的默认getchar()
行为,因为当我删除换行条件时,程序不会在换行处终止。也许我的问题超出了getchar()
,是一个一般性的问题。
假设我的输入是Hello
,我按下回车键。
首先,变量c
变成了'H'
,它被存储在行里,然后是'e'
,然后是'l'
,再然后是'l'
,最后是'o'
,之后遇到换行符循环终止。这很容易理解。
我想知道为什么它会在我按下回车键后开始读取字符。我本来希望它等待换行,然后再写一些字符。
c != '\n'
为假,因此整个 while 条件也是如此。循环结束。无论如何,此代码都表现出未定义的行为。line
没有终止,并且作为未初始化的自动变量,没有保证已经放置了终止符。因此将其作为%s
格式说明符的参数传递,这需要一个终止的字符串,会引发 UB,并且最多是一种赌博。 - WhozCraigc != '\n'
中包含了c。当我写Hello
时,无论c是什么,都是H。因此,除非你说循环在我写作时运行,否则终止没有意义。 - mr.loop