如何在不中断剩余代码的情况下仅C++中输入整数



我希望我的代码只输入整数。下面的代码可以正确完成它的工作,如果未使用整数,则要求用户输入。但是,添加代码后:

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 ...     
}

相关内容

最新更新