问题场景:
用户输入密码,输入完后进行输入,用户输入Y确认,N取消,代码如下:
int ret = 0;
char password[20] = { 0 };
printf("请输入密码:>");
scanf("%s", password);//输入密码,并存放在password数组中
printf("请确认(Y/N):>");
ret = getchar();
if ('Y' == ret)
printf("确认成功\n");
else
printf("放弃确认\n");
这时候用户输入完密码后,程序不会让用户输入,而是直接结束了,这个问题很明显是上面的scanf输入后,输入流中最后还保留一个\n被getchar()读取了,这时候输出ret就是10,对应的ASCII码表就是换行符。
printf("%d\n",ret); //10
解决方法:
首先是一个不完美的解决方法,也就是在用户输入Y/N前再写一个getchar()虽然这样的话可以把scanf的输入流多余的\n消耗掉,代码如下:
int ret = 0;
char password[20] = { 0 };
printf("请输入密码:>");
scanf("%s", password);//输入密码,并存放在password数组中
printf("请确认(Y/N):>");
getchar(); //消耗掉\n
ret = getchar();
if ('Y' == ret)
printf("确认成功\n");
else
printf("放弃确认\n");
return 0;
若用户在输入密码的时候,输入了一个空格后接着输入其他的字符,形如下
scanf("%s", password); // 123456 ABC
由于scanf的读取以空格为结束,当读取完123456后scanf读取结束,虽然第一个getchar()能够把\n消耗掉,但是输入流中还有ABC,ret就无法正常赋值,所以有了如下解决办法:
int ch = 0;
int ret = 0;
char password[20] = { 0 };
printf("请输入密码:>");
scanf("%s", password);//输入密码,并存放在password数组中
while ((ch = getchar()) != '\n') //消耗掉多出来的值
{
;
}
printf("请确认(Y/N):>");
ret = getchar();
if ('Y' == ret)
printf("确认成功\n");
else
printf("放弃确认\n");
return 0;
利用一个while循环不断地把输入流多余的代码都读取掉,这样的话最后就不会有多余的值了。