在 C++ 中,程序不会永远停止
Program going on without stopping forever in C++
我只是一个初学者,我正在尝试学习 C++ 作为我的第一语言。从我开始学习它到现在才 2-3 天,所以我在这个领域确实是个新手,这就是为什么这个问题对你来说可能听起来有点愚蠢。因此,我仍在学习 C++ 中的命令,并且在尝试了解有关 while 循环的更多信息的同时,我创建了这段代码只是为了练习。
它按照我的预期运行良好,但是当我试图强行出错并检查 while 循环如何运行时出现了问题。起初,在我输入一个年份后,while 循环会出错并给出“请输入有效年份”语句,当你第一次输入有效年份时它工作正常但如果你一开始输入错误的年份然后放一个正确的年份,它仍然会显示放一个有效的年份。无论如何,我通过对代码进行一些调整来解决这个问题。
问题是当我输入一个不。如果是 10 位或更高数字,程序将继续运行并继续执行“请输入有效年份”语句。没有就可以正常工作。那比那个小。 (见附图。)
我知道这不是什么大问题,但正如我所说,我只是一个初学者,我真的很想知道我做错了什么。我使用 Eclipse IDE 并尝试使用 MinGW 编译器在 Windows CMD 中手动编译。结果是一样的。
知道我做错了什么真的很有帮助,因为如果我连基础知识都搞不懂,那我怎么去学习更复杂的东西。图片link和代码如下。
#include <iostream>
using namespace std;
int main()
{
cout << "Enter your birth year \n";
int age, year;
cin >> year;
age = 2020 - year;
while (age <= 0) {cout << "Please input a valid year \n"; cin >> year; age = 2020 - year;}
cout << "So you are " << age << " years old \n";
if (13 < age && age < 18 ) { cout << "That classifies you as a teenager. \n"; }
else { if ( age < 13 ) { cout << "You are still a child \n";}}
if (age >= 18) { cout << "That classifies you as an adult. \n";
if (age > 60)
{cout << "And also thats quite a number you have reached. \nIt's actually higher than the average human life expectancy \nCONGRATS \n";}
}
return 0;
}
istream::operator>>
输入无效时会设置failbit
。
failbit
将阻止它接受新输入。
通常大于 10 位的整数被认为是无效的,因为 int
(32 位长)最多只能存储 2,147,483,647
.
要克服这个问题,您可以使用 basic_ios::clear
重置 failbit
。
while (age <= 0) {cout << "Please input a valid year \n"; cin >> year; age = 2020 - year;}
应该是
while (age <= 0) {
cout << "Please input a valid year \n";
cin.clear(); // add this to clear failbit
cin >> year;
age = 2020 - year;
}
我只是一个初学者,我正在尝试学习 C++ 作为我的第一语言。从我开始学习它到现在才 2-3 天,所以我在这个领域确实是个新手,这就是为什么这个问题对你来说可能听起来有点愚蠢。因此,我仍在学习 C++ 中的命令,并且在尝试了解有关 while 循环的更多信息的同时,我创建了这段代码只是为了练习。
它按照我的预期运行良好,但是当我试图强行出错并检查 while 循环如何运行时出现了问题。起初,在我输入一个年份后,while 循环会出错并给出“请输入有效年份”语句,当你第一次输入有效年份时它工作正常但如果你一开始输入错误的年份然后放一个正确的年份,它仍然会显示放一个有效的年份。无论如何,我通过对代码进行一些调整来解决这个问题。
问题是当我输入一个不。如果是 10 位或更高数字,程序将继续运行并继续执行“请输入有效年份”语句。没有就可以正常工作。那比那个小。 (见附图。)
我知道这不是什么大问题,但正如我所说,我只是一个初学者,我真的很想知道我做错了什么。我使用 Eclipse IDE 并尝试使用 MinGW 编译器在 Windows CMD 中手动编译。结果是一样的。
知道我做错了什么真的很有帮助,因为如果我连基础知识都搞不懂,那我怎么去学习更复杂的东西。图片link和代码如下。
#include <iostream>
using namespace std;
int main()
{
cout << "Enter your birth year \n";
int age, year;
cin >> year;
age = 2020 - year;
while (age <= 0) {cout << "Please input a valid year \n"; cin >> year; age = 2020 - year;}
cout << "So you are " << age << " years old \n";
if (13 < age && age < 18 ) { cout << "That classifies you as a teenager. \n"; }
else { if ( age < 13 ) { cout << "You are still a child \n";}}
if (age >= 18) { cout << "That classifies you as an adult. \n";
if (age > 60)
{cout << "And also thats quite a number you have reached. \nIt's actually higher than the average human life expectancy \nCONGRATS \n";}
}
return 0;
}
istream::operator>>
输入无效时会设置failbit
。
failbit
将阻止它接受新输入。
通常大于 10 位的整数被认为是无效的,因为 int
(32 位长)最多只能存储 2,147,483,647
.
要克服这个问题,您可以使用 basic_ios::clear
重置 failbit
。
while (age <= 0) {cout << "Please input a valid year \n"; cin >> year; age = 2020 - year;}
应该是
while (age <= 0) {
cout << "Please input a valid year \n";
cin.clear(); // add this to clear failbit
cin >> year;
age = 2020 - year;
}