Как получить правильный тип данных при получении неправильного типа данных - PullRequest
0 голосов
/ 29 апреля 2020
#include<iostream>
#include<string>
using namespace std;

int main() {
    while (1) {
        int num;
        cin >> num;
        if (typeid(num).name() != "int") {
            cout << "please input integer" << endl;
            continue;
        }
    }
}

Когда я писал такой код, я думал, что если введен неправильный тип данных, оператор while будет снова выполнен continue, а переменная num будет введена снова.

Однако вместо этого возникает бесконечный l oop. Буду признателен, если вы поможете мне с объяснением причин.

1 Ответ

1 голос
/ 29 апреля 2020

Вы не проверяете, успешно ли cin >> num; или нет. И если это не удается, вы не clear() 'ошибка, прежде чем продолжить.

Вы не можете использовать typeid() для проверки успеха / неудачи >>. Это не то, для чего это предназначено. typeid(num) вычисляется во время компиляции, в результате получается std::type_info, который описывает сам int. int всегда будет int, независимо от того, что назначено num во время выполнения. Кроме того, в вашем примере typeid(num).name() != "int" всегда будет оцениваться как true, поскольку вы сравниваете указатель const char* из name() со строковым литералом, который явно хранится в другом месте в памяти, поэтому два адреса памяти не оцениваются как равны. И поскольку вы делаете это сравнение внутри while(1) l oop, именно поэтому "please input integer" печатается бесконечно. У вас нет жизнеспособной обработки ошибок в вашем l oop.

Вы должны посмотреть на фактическое состояние cin, чтобы узнать, произошел ли сбой >>, например:

#include <iostream>
#include <string>
#include <limits>
using namespace std;

int main() {
    while (1) {
        int num;
        // cin >> num;
        // if (cin.fail()) {
        if (!(cin >> num)) {
            cout << "please input integer" << endl;
            cin.clear();
            cin.ignore(numeric_limit<streamsize>::max(), '\n');
            continue;
        }
        // use num as needed...
    }
}
...