Вы не проверяете, успешно ли 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...
}
}