问题场景:
用户输入密码,输入完后进行输入,用户输入Y确认,N取消,代码如下:
复制代码
1
2
3
4
5
6
7
8
9
10int 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码表就是换行符。
复制代码
1printf("%dn",ret); //10
解决方法:
首先是一个不完美的解决方法,也就是在用户输入Y/N前再写一个getchar()虽然这样的话可以把scanf的输入流多余的n消耗掉,代码如下:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12int 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;
若用户在输入密码的时候,输入了一个空格后接着输入其他的字符,形如下
复制代码
1scanf("%s", password); // 123456 ABC
由于scanf的读取以空格为结束,当读取完123456后scanf读取结束,虽然第一个getchar()能够把n消耗掉,但是输入流中还有ABC,ret就无法正常赋值,所以有了如下解决办法:
复制代码
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16int 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循环不断地把输入流多余的代码都读取掉,这样的话最后就不会有多余的值了。
最后
以上就是超帅小虾米最近收集整理的关于C语言中用while解决getchar()中输入流的问题问题场景:解决方法:的全部内容,更多相关C语言中用while解决getchar()中输入流内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复