scanf():在读取单个字符是,会受缓冲区残留换行干扰,面对此问题,可通过getchar()解决。下面详细介绍一下getchar这个函数。
getchar()是C标准库函数,是stdio.h标准库提供的字符读取函数,作用是从标准输入(键盘缓冲区)读取1个字符。C++为兼容C也可以直接使用,Python、Java等高级语言没有这个函数。
1、读取规则
键盘输入不是立刻被读取,先存入缓冲区
输入字符,按下回车Enter后,所有字符(包括回车换行符\n)才进入缓冲区
getchar()每次只拿缓冲区最前面的一个字符
缓冲区有数据时,不需要重新键盘输入,直接读取缓存里剩余字符。
c
#include<stdio.h>
#include<windows.h>
int main(int argc, char const *argv[])
{
/* code */
SetConsoleOutputCP(65001);
SetConsoleCP(65001);
char c;
scanf("%d",&c);
char ch = getchar();
putchar(ch);
return 0;
}
运行结果:

2、常见的用途
(1)读取单个键盘字符
(2)清空输入缓冲区--解决scanf残留问题
如下未使用getchar
c
#include<stdio.h>
#include<windows.h>
int main(int argc, char const *argv[])
{
/* code */
SetConsoleOutputCP(65001);
SetConsoleCP(65001);
char c[3];
for(int i = 0;i<3;i++){
scanf("%c",&c[i]);
}
for(int i = 0;i<3;i++){
printf("%c ",c[i]);
}
return 0;
}
运行结果:

当增加了getchar后可吸收空格字符或换行符


也可以使用scanf(" %c")先自动跳过所有空白,只接收可见字符,处理交互式字符,如下:

(3)循环读取一整行全部字符
c
#include<stdio.h>
#include<windows.h>
int main(int argc, char const *argv[])
{
/* code */
SetConsoleOutputCP(65001);
SetConsoleCP(65001);
char c;
scanf("%d",&c);
int ch;
while ((ch = getchar())!='\n'&& ch!=EOF)
{
putchar(ch);
}
return 0;
}
运行结果:

注意:返回值是int,不是char
正常读取到字符(返回该字符的ASCII码值(0-127,正数))
读到文件末尾、输入结束:返回常量EOF(值为-1,char通常是无符号范围是0-255,存不下-1,所以返回值必须用int接收)