Как попытаться прочитать как int, тогда, если он не читается как строка?

Я пытаюсь многократно читать целые числа, а токены, которые не являются целыми числами, читать и обрабатывать их как строки. Я думал, что следующее будет работать:

string s;
int x;

while(1) {
if (cin >> x)                                     // try reading as int
cout << "read int: " << x << endl;
else {                                            // try reading as string
cin.clear();

if (cin >> s)
cout << "read string: " << s << endl;
else
break;                                    // eof
}
}

Однако для ввода (с новой строкой в ​​конце)

1 2 a

это дает вывод

read int: 1
read int: 2

Кажется, что после очистки состояние потока не совсем то же, что и раньше, и на самом деле cin >> s выходит из строя. Почему это так, и как мне достичь желаемого поведения?

Чтобы уточнить, я не могу разобрать строку как int, потому что я еще не «изучил» это.

2

Решение

Почему бы не прочитать его как строку, а затем попробовать преобразование, чтобы в случае сбоя преобразования можно было рассматривать его как строку.

В C ++ 11 есть std::stoi. Что вызовет исключение, если преобразование не может быть найдено.

Другой способ — прочитать его как строку, а затем проанализировать, используя поток строк.

Если вы не можете использовать существующий метод анализа строк, почему бы не написать свой собственный?

// Returns false if not an int, otherwise true and outint will hold the correct value.
bool strtoint(const std::string str, int *outint) {
int val = 0;
for (int x = str.length() - 1; x >= 0; x--) {
if (!(str[x] <= '9' && str[x] >= '0') || !(str[x] == '-')) {
return false;
} else if (str[x] == '-') {
val *= -1;
} else {
val += (int)((str[x] - '0') * pow(10, (str.length() - 1) - x));
}
}

*outint = val;
return true;
}

Или что-то вроде этого, я не уверен, что логика полностью правильна, но я думаю, что это на правильном пути.

2

Другие решения

clear не перематывать поток; это только очищает флаги ошибок, как следует из названия. Чтобы решить вашу проблему, прочитайте ввод как строку, затем попробуйте разобрать его как int. Ссылка объясняет детали преобразования string-int лучше, чем я.

5

По вопросам рекламы ammmcru@yandex.ru