我希望我的代码只输入整数。下面的代码可以正确完成它的工作,如果未使用整数,则要求用户输入。但是,添加代码后:
while ( ! ( cin >> x ))
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), 'n');
cout << "Enter a number: ";
}
进入下面的代码,它仅在我先输入非整数时才有效。否则,如果我先输入 int,程序不会移动到下一条语句,也不会做任何事情。我的理由是,如果 x = int,那么 while 循环将不会启动。那么为什么添加代码会弄乱剩余的代码。
#include <iostream>
#include <limits>
using namespace std;
main ()
{
cout << "Enter a number: ";
int x, y;
cin >> x;
while ( ! ( cin >> x ))
{
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), 'n');
cout << "Enter a number: ";
}
cout << "Enter a number: ";
cin >> y;
问题是你从 cin
1 次阅读太多了:
int x, y;
cin >> x; // <-- reads an int, without validation!
while ( ! ( cin >> x )) { // <-- reads ANOTHER int!
在进入while
循环之前,您需要摆脱第一次读取。让循环单独完成读取:
#include <iostream>
#include <limits>
using namespace std;
main () {
int x, y;
// <-- NO READ HERE!
cout << "Enter a number: ";
while (!(cin >> x)) {
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), 'n');
cout << "Enter a number: ";
}
// same as above, for y ...
}
或者,改用do..while
循环:
#include <iostream>
#include <limits>
using namespace std;
main () {
int x, y;
// <-- NO READ HERE!
do {
cout << "Enter a number: ";
if (cin >> x) break;
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), 'n');
}
while (true);
// same as above, for y ...
}