目录
前言
1.getchar()函数
2.putchar()函数
3.清空缓冲区
3.1 缓冲区
3.2 场景
3.3 问题分析
3.4 改进(即清空缓冲区)
C语言的字符输入函数getchar和输出函数putchar功能介绍,以及缓冲区的简单认识。
1.int getchar(void) 函数从屏幕读取下一个可用的字符,并把它返回为一个整数(返回字符的ASCII码值)。这个函数在同一个时间内只会读取一个单一的字符。您可以在循环内使用这个方法,以便从屏幕上读取多个字符。
2.读取失败or遇到文件末尾是返回EOF。
ch = getchar() 和 scanf("%c", &ch); 语句效果相同
1.int putchar(int c) 函数把字符(或者你想返回字符对应的ASCII码值)输出到屏幕上,并返回相同的字符。这个函数在同一个时间内只会输出一个单一的字符。您可以在循环内使用这个方法,以便在屏幕上输出多个字符。
putchar(ch) 和 printf("%c", ch); 语句效果相同
1.什么是缓冲区?
用户输入的字符被收集并储存在一个被称为缓冲区的临时存储区,按下Enter键后,程序才可以使用用户输入的字符。
2.为什么要有缓冲区?
首先,把若干字符作为一个块进行传输比逐个发送这些字符节约时间;
其次,如果用户打错字符,可以直接通过键盘修正错误,当最后按下Enter键时,传输的是正确的输入。
#include
int main()
{
char password[20];
printf("请输入密码->");
scanf("%s", password); //数组名不需要使用取地址符&
printf("请确认Y/N:");
int ch = getchar();
if ('Y' == ch) {
printf("确认成功\n");
}
else {
printf("确认失败\n");
}
return 0;
}
输出结果:
1.从输出结果我们可以看出:在我们输入密码之后,我们并未选择确认,程序就直接认定我们确认失败。
2.问题原因:scanf 与 getchar 都是从缓冲区中获取内容,但是关键来了:scanf函数在我们输入完毕后按下Enter键(或者是空格)后方才停止输入,此时scanf中的password拿走了密码123456,但是后面你敲的回车键转变成字符 ' \n ' 被ch = getchar()拿走,也就是说ch = ' \n '肯定不等于' Y ',所以直接输出确认失败。
1.由3.3分析可知,密码确认的失败主要是因为getchar读取的 ' \n ' 导致,因此,我们需要清空缓冲区,即scanf读取后缓冲区剩余字符我们需要清空。
#include
int main()
{
char password[20];
printf("请输入密码->");
scanf("%s", password); //数组名不需要使用取地址符&
getchar(); //这里我又加了一个getchar(),这样\n就被去掉了
printf("请确认Y/N:");
int ch = getchar();
if ('Y' == ch) {
printf("确认成功\n");
}
else {
printf("确认失败\n");
}
return 0;
}
2.缓冲区字符较多,如何清空?
①还是上面的代码,比如输入123456 abcd,在6后面我输入了一个空格,此时scanf只读取到6,则缓冲区还剩下abcd\n五个字符,但是getchar()一次只能去除一个,则我们需要通过循环的方式,逐步去除缓冲区中所有的剩余字符。
②代码演示:
#include
int main()
{
char password[20];
printf("请输入密码->");
scanf("%s", password); //数组名不需要使用取地址符&
int ch = 0;
while (ch = getchar() != '\n') {
;
}
printf("请确认Y/N:");
ch = getchar();
if ('Y' == ch) {
printf("确认成功\n");
}
else {
printf("确认失败\n");
}
return 0;
}
运行结果:
这样我们就达到了一个清空缓冲区的效果!