0

我希望我的代码只输入整数。下面的代码正确地完成了它的工作,并在未使用整数时询问用户输入。但是,添加代码后:

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;
4

1 回答 1

1

问题是您从cin1 次阅读太多:

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 ...     
}
于 2018-03-18T20:09:59.163 回答