Cin.ignore(numeric_limits <streamsize>:: max(), '\n'); max() не распознает
Я беру ввод на С++, и я использую VStudio 2013 на Win7. Я пытаюсь избежать неправильного ввода данных из моих меню, и он работает во всех них, кроме этого.
cout << "Please choose your second number" << endl;
cin >> move2;
if (move2 < 1 || move2 > size)
{
cout << "That not a valid move" << endl;
Sleep(2000);
cin.sync();
cin.clear();
}
Единственное различие заключается в том, что в условии move > переменной (size) нет числа. Когда я вхожу в char, он возвращается к вопросу, запрашивая другой ввод, но если я введу слово, оно сломается!
Я пытаюсь использовать cin.ignore(numeric_limits<streamsize>::max(), '\n');
, но компилятор выделяет max()
, и он говорит "ожидающий идентификатор".
Это может быть легко для всех вас хорошими программистами, но я не знаю, как это исправить. Кто-нибудь может мне помочь?
Ответы
Ответ 1
Это связано с тем, что в Visual Studio при использовании окон он будет определять макрос max(). Если вы наведите указатель мыши на max() в своем примере, вы должны получить предупреждение intellisense. Вы можете решить эту проблему, указав max после всех своих включений и перед любым кодом.
#undef max
Ответ 2
Чтобы использовать std::numeric_limits<T>
, вам нужно включить <limits>
. Кроме того, тип, переданный ему, должен быть известен и фактически тип std::streamsize
, то есть я буду использовать его как
#include <iostream>
#include <limits>
// ...
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
Кроме того, вероятно, вы должны убедиться, что ваша попытка прочитать что-то была фактически успешной, и если это не так, сначала clear()
состояние потока. Вот полная программа (она, конечно, компилируется и работает с gcc и clang):
#include <iostream>
#include <limits>
int main()
{
int move2, size(3);
while (!(std::cin >> move2) || move2 < 1 || size < move2) {
std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');
std::cout << "invalid input ignored; please enter a valid move\n";
}
std::cout << "move2=" << move2 << '\n';
}
Ответ 3
Если cin имеет ошибку, следующее очистит состояние ошибки, а затем прочитает оставшуюся часть строки.
if(!cin)
{
cin.clear();
string junk;
getline(cin, junk);
}
Ответ 4
Включить:
#include <climits>
и посмотрим, поможет ли это. У меня была такая же проблема, и когда я изменил ее с пределов до климатических условий, это было решено.