关于 getchar() 和换行符的澄清问题

6

我对使用getchar()从用户读取字符输入有疑问。

char char1, char2;
char1 = getchar();
char2 = getchar();

我需要从用户获取2个字符作为输入。在这种情况下,如果用户输入字符"A",然后是一个换行符,然后是字符"B",那么将存储在char2中的是换行符还是字符'B'?
我在Windows上的CodeBlocks上尝试了一下,char2实际上存储的是换行符,但我本打算将其存储为字符'B'。
我只是想知道预期行为是什么,是否与编译器有关?如果是这样,Turbo C和mingW之间有什么区别?
4个回答

10

是的,你需要在每次输入后消耗掉换行符:

char1 = getchar();
getchar(); // To consume `\n`
char2 = getchar();
getchar(); // To consume `\n`

这不是与编译器有关的。因为每行输入的末尾都会有回车符,所以对于所有平台都是正确的(尽管实际的换行符可能因平台而异)。


一个小问题:getchar()函数会简单地清除数据,还是需要占用空间来保存LF? - Fuevo
@hikaru89 getchar() 调用仅返回。如果它没有在程序中保存(如此处的第2个和第4个调用),则会被丢弃,不涉及任何额外的存储。 - P.P

0

您可以通过显式测试来防止读取换行符。 而不是简单地使用

getchar():

你可以像这样使用:

while((char1 = getchar()) == '\n');

如果你在Windows上,你可能也想测试'\r'。所以代码会有一点变化。
while((char1 = getchar()) == '\n' || char1 == '\r');

0
我只想知道预期的行为是什么,是否取决于编译器?
这是预期的行为,而不是与编译器有关。
您可以使用scanf读取A后面跟着换行符,然后是B后面跟着换行符。如果您想坚持使用getchar(),那么只需将输入设置为AB即可。

-2
在语句之间添加语句fflush(stdin);。 看这个
ch1=getchar();

fflush(stdin);
ch2=getchar();

8
根据C标准,对输入流调用fflush()是未定义的行为。在Windows上,至少在Visual Studio中,它可以工作,但应该避免使用,因为它是非标准的。 - Thomas Padron-McCarthy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接