С++ Ошибка ввода при вводе числа с плавающей запятой вместо целого

Вопрос: Я пытаюсь написать что-то для класса, это в основном крошечный интернет-магазин. Идея состоит в том, чтобы отобразить некоторое количество акций, спросить пользователя, сколько он хочет, и отобразить тележку, когда они закончены. У меня есть все, что мне нужно, и оно отлично работает, если пользователь не говорит, что хочет что-то с плавающей запятой. Мы должны

Вопрос:

Я пытаюсь написать что-то для класса, это в основном крошечный интернет-магазин. Идея состоит в том, чтобы отобразить некоторое количество акций, спросить пользователя, сколько он хочет, и отобразить тележку, когда они закончены. У меня есть все, что мне нужно, и оно отлично работает, если пользователь не говорит, что хочет что-то с плавающей запятой.
Мы должны проверять все входы на наличие ошибок и продолжать запрашивать у пользователя, пока не будет введен правильный ввод. У меня есть учетная запись, которую я знаю, состоящую из букв и цифр, но когда вводится десятичная цифра, округляется до ближайшего целого числа, используется для текущего элемента, а затем переходит к следующей вероятности ввода ( следующий пункт) и сразу же появляется сообщение об ошибке.

void printError(int stock, int &numberOfCopies){ cin.clear(); cin.ignore(INT_MAX, ‘n’); cout << «Invalid amount» << endl << «Enter a number from 0 — » << stock ><< «: «; cin >> numberOfCopies; } int getQuantity(string title, int stock){ int numberOfCopies; cin >> numberOfCopies; while (cin.fail() || numberOfCopies < 0 || numberOfCopies > stock){ printError(stock, numberOfCopies); } if (numberOfCopies == 1){ cout << endl << numberOfCopies << » copy of » << title << » has been >added to your cart» << endl; } else if (numberOfCopies > 1 && numberOfCopies <= stock){ cout << endl << numberOfCopies << » copies of » << title << » have >been added to your cart» << endl; } else if (numberOfCopies == 0){ cout << «You did not change your cart» << endl; } return numberOfCopies; } int numberOfCopies1 = getQuantity(title1, stock1);

Это то, что я должен проверить на наличие ошибок прямо сейчас (title1 и stock1 предопределены). Я использую cin.fail() для проверки значений, которые не являются целыми числами, но не работает при вводе десятичных знаков.
Что я здесь упускаю?

Лучший ответ:

когда вводится десятичная цифра, округляется до ближайшего целого числа, используется для текущего элемента, затем пропускается к следующему входному шансу (следующий элемент) и сразу появляется сообщение об ошибке

То, как потоки предназначены для работы, поэтому они могут использоваться для синтаксического анализа int, за которым должны следовать любые другие разделители или контент. Если вы хотите рассматривать это как ошибку – проверяя, что нет конечного мусора, вы должны использовать std::getline, после чего обычно удобно создавать std::istringstream для получения int, не проверяя после этого мусора:

std::string line; while (getline(std::cin, line)) { std::istringstream iss(line); if (line >> n >> std::ws && iss.eof()) break; …clear/ignore/prompt again… }

istringstream getline/istringstream соответствует количеству входных данных, которое вы можете ожидать от std::cin при запросе одного целого числа – если вы непосредственно использовали std::cin >> n >> std::ws && std::cin.eof(), он будет терпеть неудачу, если std::cin ударит EOF – например, пользователь набрал Control-D на хосте UNIX/Linux, Control-Z на Windows и т.д., после чего они, возможно, не смогут ввести больше текста (зависит на точной ОС).

Обратите внимание, что потоковая передача в float или double затем проверка его равным floor самого себя, решила бы точную проблему, о которой вы сообщали, но тогда, если кто-то наберет другую бессмыслицу “27x”, “27O”, вы все равно извлечете ведущую целую часть и остальное вызывают отчет об ошибке в следующий раз….

Оцените статью
Добавить комментарий