程序代码
首先我们来看这样一段代码
#include<stdio.h>
int main()
{
char password[10] = { 0 };
printf("请输入密码:");
scanf("%s", password);
printf("请确认密码(Y/N):");
int ch = getchar();
if (ch == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
}
是不是有些同学会认为输完密码后,再输入Y就会打印出确认成功呢,但实际上却并是这样
可以看到程序并没有等待我们输入,就打印出了确认失败,这就涉及到了对输入缓冲区的理解,输入缓冲区到底是什么呢?
缓冲区
缓冲区:缓冲区又称为缓存,是内存空间的一部分。也就是说,在内存空间中预留了一定的存储空间,这些存储空间用来缓冲输入或输出的数据,这部分预留的空间就叫做缓冲区。
缓冲区根据其对应的输入设备还和输出设备,分为输入缓冲区和输出缓冲区
当我们从键盘输入数据时,实际上将数据输入到了输入缓冲区,了解了缓冲区的概念,我们再来分析一下这个程序。在分析这个程序之前我们需要知道以下两点知识。
scanf和getchar()
- scanf函数在读取字符时遇到空格或者回车会停止读取。
- getchar()函数原型: int getchar(void)
当程序调用getchar()函数时,程序就等着用户按键, 用户输入的字符被存放在键盘缓冲
区中,直到用户按回车为止(回车字符也放在缓冲区中) 。当用户键入回车之后,
getchar()函数 才开始从键盘缓冲区中每次读入一个字符 。也就是说, 后续的getchar()函
数调用不会等待用户按键,而直接读取缓冲区中的字符,直到缓冲区中的字符读完后,才
重新等待用户按键 。
通俗一点说,当程序调用getchar()函数时,程序就等着用户按键,并等用户按下回车键返
回。期间按下的字符存放在缓冲区,第一个字符作为函数返回值。继续调用getchar()函
数,将不再等用户按键,而是返回您刚才输入的第2个字符;继续调用,返回第3个字符
,直到缓冲区中的字符读完后,才等待用户按键。
getchar()函数的执行就是采用了行缓冲。第一次调用getchar()函数,会让程序使用者(用
户)输入一行字符并直至按下回车键 函数才返回。此时用户输入的字符和回车符都存放
在行缓冲区。再次调用getchar()函数,会逐步输出行缓冲区的内容。
程序的修改
确认失败的原因:
当我们把 字符 1 2 3 4 5 6 \n敲入输入缓冲区后,scanf读取字符1 2 3 4 5 6放到password的数组中
此时缓冲区里还剩下一个\n,然后getchar()函数将\n读取给ch,ch不等于Y,因此打印出确认失败.
如何修改:
只要当getchar()读取时,我们的缓冲区里没有字符,那么getchar()就会等待我们输入
修改以后代码:
#include<stdio.h>
int main()
{
char password[10] = { 0 };
printf("请输入密码:");
scanf("%s", password);
printf("请确认密码(Y/N):");
int ch;
while ((ch = getcahr()) != '\n');
ch = getchar();
if (ch == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
}
这里的while循环的作用就是用来拿掉缓冲区里多余的字符,从而达到清空缓冲区的作用
好了,今天就讲到这里了,希望能对你们有所帮助