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. 输入了一个非正数
请输入一个正整数:
-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 判断字母,数字,空格,标点符号的方法。 (没有分了,请大家帮帮忙~谢谢~)

c语言 如何判断输入的是数字还是字母

计算用户输入字符串中的数字、小写字母和标点符号的程序中的分段错误

2022华为机试真题 C++ 实现非严格递增连续数字序列

关于c++。 我判断输入是不是为数字,并直到输入数字。