C之关于输入缓冲区的一些小问题
一、直接上代码(有些小问题)
int ret = 0;
int ch =0;
char pw[20] = {0};
printf("输入密码:");
scanf("%s", &pw);
printf("确认Y/N:");
ret = getchar();
printf("%d", ret);
printf("\n");
if(ret == 'Y'){
printf("Yes");
} else{
printf("NO");
}
运行输入的结果是:(只输入了密码,程序就运行到结束了,并没有执行ret = getchar()的输入Y/N的一个输入语句)
输入密码:123456
确认Y/N:10
NO
二、原因分析
当你在输入密码时,输入的是:
123456回车
这样在输入的缓冲区的数据就是:
123456'\n'
这样,pw就拿走了:
123456
剩下了:
'\n'
接着,ret = getchar()就拿走了缓冲区最后的
\n
这样就导致了 ret 已经拿到了值,而不再需要输入的数据了,在ASCII中 \n 对应的就是 10,所以就出现了上述的输出。
三、改进方案
#include<stdio.h>
int main(){
int ret = 0;
int ch =0;
char pw[20] = {0};
printf("输入密码:");
scanf("%s", &pw);
printf("确认Y/N:");
while((ch = getchar())!='\n'){
;
}
ret = getchar();
printf("%d", ret);
printf("\n")
if(ret == 'Y'){
printf("Yes");
} else{
printf("NO");
}
//printf("%d",'\n');
return 0;
}
此时,加上这段代码
while((ch = getchar())!='\n'){
;
}
就会将输入的缓冲区的数据全部清空(多余的回车或其他没有的数据)
这样的程序就可以正常输入了!
(正确的输入结果)
输入密码:123456
确认Y/N:Y
89
Yes
四、结束语
1、若有疑问或错误可以提出;
2、还请各位大佬提出不足与建议,谢谢!
3、感谢各位大佬的观看,谢谢!