小白编写,大佬勿喷,欢迎指正.
getchar()函数
在缓冲区内获取一个字符
获取失败将会返回EOF(EOF是一个字符常量 为-1)
头文件是<stdio.h>
当我们写了这样一段代码时
#include <stdio.h>
int main()
{
char ch = 0;
char arr[20] = { 0 };
printf("请输入密码:");
scanf("%s", arr);//输入abcdef
printf("请确认密码(Y/N)");
ch = getchar();
printf("\n");
if (ch == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
运行结果是
图中可以看到,我们还并没有输入确认密码(Y/N) 就直接输出了确认失败.
出现这种情况的原因是
我们看到在键盘输入字符 abcdef 加回车 在内存缓冲区中实际存入的字符是 "abcdef\n"
scanf只能拿走abcdef 最后缓冲区中剩下一个字符'\n' 当代码运行到getchar时 直接读取了'\n' 所以直接打印了 确认失败
那么如何解决呢
既然getchar可以获取缓冲区的字符,我们不妨在 ch = getchar(); 之前再写一个getchar函数,让这个getchar把内存中的'\n' 拿走,这样当运行到 ch = getchar()时缓冲区内没有数据,程序就会停下来等待我们输入.
代码如下
#include <stdio.h>
int main()
{
char ch = 0;
char arr[20] = { 0 };
printf("请输入密码:");
scanf("%s", arr);//输入abcdef
printf("请确认密码(Y/N):");
getchar();
ch = getchar();
printf("\n");
if (ch == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
运行结果
不要以为这样就解决了问题.
当有人这样输入呢?
这次程序又没有停下来,直接打印了确认失败.为什么会这样呢.
原因是 使用%s输入 遇到空格就停止了,所以当scanf拿走了abcdef,缓冲区中还剩 空格123\n .
那么如何解决这种情况呢
第一种方法我们可以用gets()函数这里就不展开了
第二种方法是循环使用getchar()函数把缓冲区的数据拿空,到了确认密码的时候程序就会停下来.
代码如下
#include <stdio.h>
int main()
{
char ch = 0;
char arr[20] = { 0 };
printf("请输入密码:");
scanf("%s", arr);//输入abcdef 123
printf("请确认密码(Y/N):");
while (getchar() != '\n') //当getchar拿到了'\n' 说明缓冲区已经空了
{
;
}
ch = getchar();
if (ch == 'Y')
{
printf("确认成功\n");
}
else
{
printf("确认失败\n");
}
return 0;
}
运行结果如图
这样就解决了问题.
文章评论