#include <stdio.h>
int main() {
int n = 6;
while (n--){
int c = getchar();
printf("%c",c);
}
return 0;
}
谁能解释一下上面的代码?比如我输入一个像这样的东西
99999
得到如下输出
99999
但是我在给出5个9后按了Enter键,但是所有的9是怎么读的呢?我的意思是,如果我使用scanf,我必须在每次输入后按enter键,但我没有这样做,我将getchar的返回值赋给一个int变量,它不能存储5个int,那么getchar函数是如何一次读取所有5个9的呢?
这实际上与C语言无关,而是与操作系统和输入输出子系统有关。
默认情况下,终端输出是面向行的,这意味着底层系统(驱动程序和/或系统例程)缓冲键盘上键入的内容,并且仅在一行完成时(给出回车或换行)才向程序提供数据。
在类似Unix的系统(Linux,…)中,您可以使用stty raw
将终端设置为原始模式,以使您的C程序能够在键入字符后一次处理一个字符。但要注意,它有令人讨厌的副作用,如要求CtrlJ进入新行…
如果您要运行这个演示程序
#include <stdio.h>
int main( void )
{
size_t n = 6;
while ( n-- )
{
int c = getchar();
printf( "%c", c );
}
n = 6;
while ( n-- )
{
char c;
scanf( "%c", &c );
printf( "%c", c );
}
return 0;
}
和两次进入序列
99999
,然后按回车键你会得到两个while循环的相同输出
99999
99999
这是两个调用
int c = getchar();
和
scanf( "%c", &c );
将按顺序读取数字9,在它们之后将读取新的行字符'n'
。
使用getchar
和scanf
读取字符的显著区别是,您可以通过在格式字符串中插入空白来跳过使用scanf
读取空白字符,例如
scanf( " %c", &c );
^^^^^
如果您将在上面的演示程序中进行此更改,并将输入序列
9
9
9
9
9
9
9
则程序输出将是
9
9
9
999999