Почему cin терпит неудачу, когда я ввожу цифры вроде: 1 3999999999, но он работает для меньших чисел, таких как: 1 5?
int main()
{
int N, X;
cout << sizeof(int);
cout << "Please enter two numbers: ";
cin >> N >> X;
vector <int> numbers = vector<int>();
int currentNumber;
cout << "Please enter list of numbers: ";
for ( int i = 0; i < N; i++ )
{
cin >> currentNumber;
if (cin.fail())
cout << "Something sucks!";
numbers.push_back(currentNumber);
}
sort(numbers.begin(), numbers.end(), Compare(X));
cout << "The list is now: " << endl;
for (int i = 0; i < N; i++)
{
cout << numbers[i] << " ";
}
cout << endl;
return 0;
}
Это просто пропускает шаг.
Пытаться:
std::cout << std::numeric_limits<int>::max() << std::endl; // requires you to #include <limits>
int
в вашей системе, скорее всего, это 32-разрядное число со знаком двоичного числа, что означает, что максимальное значение, которое оно может представлять, составляет 2 147 483 647. Ваш номер 3 999 999 999 больше этого значения и не может быть правильно представлен int
, cin
не удается, предупреждая вас о проблеме.
long
может быть 64-разрядным целым числом в вашей системе, и если это так, попробуйте это. Вам нужно 64-битное целое число для пересчета 3,999,999,999. Кроме того, вы можете использовать unsigned int
, который сможет представлять числа размером до 4 294 967 295 (опять же, в типичной системе). Конечно, это означает, что вы не можете представлять отрицательные числа, так что это компромисс.
Это, вероятно, потому, что большое значение слишком велико, чтобы поместиться в переменную int
введите в вашей системе. Попробуйте просто присвоить большое значение вашей переменной и посмотрите, что произойдет.
Чтобы исправить это, измените тип переменной на более широкий тип, например long
или же long long
,
Максимальное число, представимое int
зависит от количества битов, которые оно представлено. Обычно это 32-битные, т.е. максимальное число 2147483647
, который меньше, чем число, которое вы набрали.
Когда отформатированные функции ввода терпят неудачу в некоторой форме, они устанавливают std::ios_base::failbit
и оставьте исходное значение в аргументе без изменений. Существуют разные сбои, и переполнения считаются одним из видов сбоев. Я вспоминаю дискуссию о том, что разные ошибки указываются по-разному, но я не помню результат. Лучшая ставка может быть, чтобы убедиться, errno
очищается перед вызовом любой из входных функций и проверкой errno
за ERANGE
отличить переполнение от ошибки формата.