一.回顾
我们上篇文章主要介绍了 getchar() 函数的使用以及如何使用 while语句循环获取用户输入并进行输出,
在上篇文章的末尾我们遇到了一个问题那就是如何解决 getchar() 误读取到缓冲区中的 '\n' 字符,我们给出的方法是使用一个 getchar() 把缓冲区中的 '\n' 字符都去掉再用一个变量 check 来接收用户的输入
最后使用 if 语句进行判断,示例代码如下:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
int main(void){
char password[15] = { 0 };
printf("请输入密码:");
scanf("%s", password);
getchar();
printf("请确认(Y/N):");
int check = getchar();
if (check == 'Y'){
printf("确认成功!\n");
}
else{
printf("失败!\n");
}
system("pause");
return 0;
}
二. while循环的进阶用法
上面的代码确实可以起到一定的作用来解决 '\n' 留在缓冲区内被 getchar() 函数误读取的问题,但是当我们输入 12345(space)6789 的时候程序依然会出现问题,如图所示:
这是因为scanf()函数的读取机制导致的,当scanf()函数读取到空格符的时候便会自动停止下面的内容将不被读取,这就导致了缓冲区中的内容为 : 6789'\n' 当下一个getchar()函数读取缓冲区的时候便会使用这段内容,导致程序运行失败,那么我们该如何解决呢?这里就用到了我们的 while 循环,我们可以使用 while 循环,利用 getchar() 函数循环读取缓冲区内的多余数据以确保当我们 check 接收到的是 Y /N
那么我们可以这样写:
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<windows.h>
int main(void){
char password[15] = { 0 };
printf("请输入密码:");
scanf("%s", password);
int i = 0;
while ((i = getchar())!= '\n'){
;
}
printf("请确认(Y/N):");
int check = getchar();
if (check == 'Y' || 'y'){
printf("确认成功!\n");
}
else{
printf("失败!\n");
}
system("pause");
return 0;
}
当我们程序一直读取的时候则表达式条件为真,进入循环,当我们遇到 '\n' 的时候这时表达式就为假了,跳出循环这时候缓冲区也被清理干净了,所以我们再次输入 Y / N 时候就会直接被下一个getchar()读取,程序也就正常运行了,如图所示:
2024/2/14
王起舟