cin & gt; & gt; терпит неудачу с большими числами, но работает с меньшими?

Почему 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;
}

Это просто пропускает шаг.

2

Решение

Пытаться:

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 (опять же, в типичной системе). Конечно, это означает, что вы не можете представлять отрицательные числа, так что это компромисс.

4

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

Это, вероятно, потому, что большое значение слишком велико, чтобы поместиться в переменную int введите в вашей системе. Попробуйте просто присвоить большое значение вашей переменной и посмотрите, что произойдет.

Чтобы исправить это, измените тип переменной на более широкий тип, например long или же long long,

0

Максимальное число, представимое int зависит от количества битов, которые оно представлено. Обычно это 32-битные, т.е. максимальное число 2147483647, который меньше, чем число, которое вы набрали.

0

Когда отформатированные функции ввода терпят неудачу в некоторой форме, они устанавливают std::ios_base::failbit и оставьте исходное значение в аргументе без изменений. Существуют разные сбои, и переполнения считаются одним из видов сбоев. Я вспоминаю дискуссию о том, что разные ошибки указываются по-разному, но я не помню результат. Лучшая ставка может быть, чтобы убедиться, errno очищается перед вызовом любой из входных функций и проверкой errno за ERANGE отличить переполнение от ошибки формата.

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