C 语言中的"getchar"函数


#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'

使用getcharscanf读取字符的显著区别是,您可以通过在格式字符串中插入空白来跳过使用scanf读取空白字符,例如

scanf( " %c", &c );
^^^^^

如果您将在上面的演示程序中进行此更改,并将输入序列

9
9
9
9
9
9
9

则程序输出将是

9
9
9
999999

相关内容

  • 没有找到相关文章

最新更新