C++——while循环误输入非数字(如字母,标点)导致死循环的解决方法
Posted 借我十斤肉
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++——while循环误输入非数字(如字母,标点)导致死循环的解决方法相关的知识,希望对你有一定的参考价值。
1 问题描述
要求输入一个正整数,并判断是否成功输入一个正整数,若成功输入,则程序结束;若输入的不是一个正整数,则提示用户输入错误,并要求用户重新输入一个正整数。直到用户成功输入一个正整数,程序结束。
当用户误输入一个非数字,可能会造成程序的死循环
2 出现死循环的原因
示例1( 错误❌ )
#include <iostream>
using namespace std;
int main()
{
int a;
cout << "请输入一个正整数:" << endl;
while (true)
{
cin >> a;
if (a > 0)
{
cout << "成功输入一个正整数!" << endl;
break;
}
else
{
cout << "输入错误,请重新请输入一个正整数:\\a" << endl;
}
}
return 0;
}
示例1的结果有三种情况:
- 成功输入一个正整数
请输入一个正整数:
1
成功输入一个正整数!
- 输入了一个非正数
请输入一个正整数:
-1
输入错误,请重新请输入一个正整数:
1
成功输入一个正整数
- 误输入一个非数字,如字母,程序进入死循环!
请输入一个正整数:
aa
输入错误,请重新请输入一个正整数:
输入错误,请重新请输入一个正整数:
输入错误,请重新请输入一个正整数:
输入错误,请重新请输入一个正整数:
输入错误,请重新请输入一个正整数:
输入错误,请重新请输入一个正整数:
输入错误,请重新请输入一个正整数:
输入错误,请重新请输入一个正整数:
输入错误,请重新请输入一个正整数:
输入错误,请重新请输入一个正整数:
输入错误,请重新请输入一个正整数:
输入错误,请重新请输入一个正整数:
输入错误,请重新请输入一个正整数:
...
...
cin 输入原理:
程序的输入都建有一个缓冲区,即输入缓冲区。一次输入过程是这样的,当一次键盘输入结束时会将输入的数据存入输入缓冲区,而cin函数直接从输入缓冲区中取数据。正因为cin函数是直接从缓冲区取数据的,所以有时候当缓冲区中有残留数据时,cin函数会直接取得这些残留数据而不会请求键盘输入。
int a =0; //a为整形数据,在输入非数字,如字符型数据时,按回车,cin 会认为 a 没有输入(非法输入),不会读取缓冲器中输入的内容;等下次再读取时,发现缓冲区有数据进行读取,因为仍是字符型数据,便还是认为 a 没有输入,不会读取缓冲器的字母;因此造成死循环。
3 解决方法
在while循环的最后面添加两条语句, 缺一不可
cin.clear();
cin.ignore();
其中cin.clear(),清空缓冲区,并将错误的cin流标识,通过这个可以把假状态清除掉;cin.ignore() 解决编译器编译while循环时因在缓冲区找不到合乎条件的数据而出现死循环的情况。
示例2( 正确✔)
#include <iostream>
using namespace std;
int main()
{
int a = 0;
cout << "请输入一个正整数:" << endl;
while (true)
{
cin >> a;
if (a > 0)
{
cout << "成功输入一个正整数" << endl;
break;
}
else
{
cout << "输入错误,请重新请输入一个正整数:\\a" << endl;
}
cin.clear();
cin.ignore();
}
return 0;
}
当用户输入一个非数字,如字符型时,程序仍具有稳健性
请输入一个正整数:
a
输入错误,请重新请输入一个正整数:
\\
输入错误,请重新请输入一个正整数:
25
成功输入一个正整数
以上是关于C++——while循环误输入非数字(如字母,标点)导致死循环的解决方法的主要内容,如果未能解决你的问题,请参考以下文章
JAVA 判断字母,数字,空格,标点符号的方法。 (没有分了,请大家帮帮忙~谢谢~)