Как сделать проверку на число в си
Я новичок в C ++, и у меня есть функция, в которой я хочу, чтобы пользователь ввел double значение. Как мне обеспечить, чтобы введенное значение имело правильный тип данных? Кроме того, как будет обработана ошибка? На данный момент это все что у меня есть:
Я использую `try <> catch () <>, но я не думаю, что это правильное решение для этой проблемы. Любая помощь будет оценена.
Решение
Если ostream& operator>>(ostream& , T&) не удается извлечь отформатированные данные (такие как целое число, двойное число, число с плавающей запятой, …), stream.fail() будет правдой и, таким образом, !stream оценит как истину тоже.
Так что вы можете использовать
Это важно ignore остальная часть линии, так как operator>> больше не будет извлекать данные из потока, так как они в неправильном формате. Так что если вы удалите
Ваш цикл никогда не закончится, так как вход не очищен от стандартного ввода.
-
( cin.ignore ) ( cin.fail() ) (используется для максимального количества игнорируемых символов, определенного в
- ).
Другие решения
Вам нужно прочитать всю строку, используя std::getline а также std::string , Это способ полностью проверить, что вся строка имеет правильный тип данных:
Этот пример не требует пояснений, однако при таком подходе вы не можете различить int и double.
Большинство программ, имеющих хоть какой-либо пользовательский интерфейс, сталкиваются с обработкой пользовательского ввода. В программах, которые мы писали раньше, используется std::cin для получения пользовательского ввода. А так как ввод данных имеет свободную форму (пользователь может ввести всё, что пожелает), то пользователю очень легко ввести данные, которые от него никак не ожидаются.
При написании программ, вы всегда должны учитывать, как пользователи (преднамеренно или непреднамеренно) могут использовать ваши программы. Хорошо написанная программа предвидит, как ею могут злоупотребить, и либо будет обрабатывать такие случаи, либо предотвращать их (если это возможно). Программа, которая имеет обработку некорректного ввода, называется надежной.
На этом уроке мы рассмотрим, как пользователи могут вводить некорректные данные через std::cin, а также как с этим бороться.
std::cin, буфер данных и извлечение
Прежде чем разбираться с обработкой некорректного ввода через std::cin и оператор >> , давайте сначала рассмотрим их принцип работы.
Процесс, когда мы используем оператор >> для получения данных от пользователя и размещение этих данных в определенной переменной, называется извлечением. Соответственно, оператор >> называется оператором извлечения.
Когда пользователь вводит данные в ответ на операцию извлечения, то эти данные помещаются в буфер std::cin. Буфер данных — это просто часть памяти, зарезервированная для временного хранения данных, когда они перемещаются из одного места в другое. В этом случае буфер используется для хранения пользовательского ввода, пока он находится в режиме ожидания выделения для него переменных.
При использовании оператора извлечения, выполняется следующая процедура:
Если во входном буфере есть данные, то эти данные используются для извлечения.
Если во входном буфере нет данных, то пользователю предлагается ввести данные (обычно именно это и происходит в большинстве случаев). Когда пользователь нажимает Enter, символ новой строки \n помещается во входной буфер.
Оператор >> извлекает столько данных из входного буфера в переменную, сколько позволяет размер самой переменной (игнорируя любые пробелы, табы или \n ).
Любые данные, которые не были извлечены, остаются во входном буфере для последующего извлечения.
Извлечение данных считается успешным, если по крайней мере один символ был извлечен из входного буфера. Оставшиеся данные во входном буфере используются для последующих извлечений. Например:
Если пользователь введет 7d , то 7 будет извлечено, преобразовано в целое число и присвоено переменной a . А d\n останется во входном буфере дожидаться следующего извлечения.
Извлечение не выполняется, если данные ввода не соответствуют типу переменной, выделенной для них. Например:
Если бы пользователь ввел z , то извлечение не выполнилось бы, так как z не может быть извлечено в целочисленную переменную.
Проверка пользовательского ввода
Существует три основных способа проверки пользовательского ввода:
Предотвращение некорректного пользовательского ввода.
Пользователь может вводить всё, что хочет, но осуществляется последующая проверка данных. Если проверка прошла успешно, то выполняется перемещение данных в переменную.
Пользователь может вводить всё, что хочет, но при операции извлечения данных оператором >> параллельно решаются возможные ошибки.
Некоторые графические пользовательские интерфейсы или расширенные текстовые интерфейсы позволяют проверять ввод пользователя сразу (символ за символом). Программист создает функцию проверки данных, которая принимает и проверяет пользовательский ввод, и, если данные ввода корректны, то возвращается true, если нет — false. Эта функция вызывается каждый раз, когда пользователь нажимает на клавишу. Если функция проверки возвращает true, то символ, который пользователь ввел — принимается. Если функция возвращает false, то символ, который только что ввел пользователь — отбрасывается (и не отображается на экране). Используя этот метод, мы можем гарантировать, что любой пользовательский ввод будет корректным, так как любые неверные нажатия клавиш будут обнаружены и немедленно удалены. К сожалению, std::cin не поддерживает этот тип проверки.
Поскольку строки не имеют никаких ограничений на то, какие символы вводятся, то извлечение гарантированно будет успешным (хотя помним, что std::cin останавливает процесс извлечения при первом обнаружении символа пробела). После ввода строки программа сразу может её проанализировать. Однако этот анализ и последующая конвертация данных в другие типы данных (например, числа) может быть сложной, поэтому это делается только в редких случаях.
Чаще всего мы позволяем std::cin и оператору извлечения выполнять тяжелую работу. В соответствии с этим методом пользователь может вводить всё, что хочет, а далее std::cin и оператор >> пытаются извлечь данные и, если что-то пойдет не так, выполняется обработка возможных ошибок. Это самый простой способ, и его мы и будем рассматривать.
В этом руководстве мы узнаем о функции isdigit() C++ с помощью примеров.
Функция isdigit() в С++ проверяет, является ли данный символ цифрой или нет.
Синтаксис
Синтаксис функции isdigit():
Здесь ch – это символ, который мы хотим проверить.
Параметры
Функция принимает следующие параметры:
- ch – проверяемый символ, приведенный к типу int или EOF
Возвращаемое значение
Функция isdigit() возвращает:
- ненулевое целочисленное значение (истина), если ch – цифра
- целое число ноль (ложь), если ch не является цифрой
Прототип isdigit(), как определено в заголовочном файле cctype:
Как мы видим, символьный параметр ch на самом деле имеет тип int. Это означает, что функция isdigit() проверяет значение ASCII символа.
Поведение isdigit() не определено, если:
- значение ch не может быть представлено как unsigned char, или
- значение ch не равно EOF.
Пример: C ++ isdigit()
Здесь мы создали строку C str . Затем мы напечатали только цифры в строке, используя цикл for. Цикл выполняется от i = 0 до i = strlen (str) – 1.
Другими словами, цикл проходит по всей строке, поскольку strlen() дает длину str .
На каждой итерации цикла мы используем функцию isdigit(), чтобы проверить, является ли строковый элемент str [i] цифрой или нет. Результат сохраняется в проверочной переменной.
Если проверка возвращает ненулевое значение, мы печатаем строковый элемент.
Проверка чисел на четность в Python
Проверка числа на четность в Java
Проверка числа на четность в PHP
Проверка числа на четность в JavaScript
else
console.log("Это нечетное число");
>
Заключение
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Чтобы определить, является ли строка допустимым представлением указанного числового типа, воспользуйтесь статическим методом TryParse , реализуемым всеми простыми числовыми типами, например DateTime и IPAddress. В следующем примере показано, как определить, является ли число 108 допустимым типом int.
Если строка содержит нечисловые знаки либо числовое значение слишком велико или мало для указанного типа, TryParse возвращает значение "false" и задает выходному параметру значение "0". В противном случае возвращается значение "true", а выходному параметру задается числовое значение строки.
Строка может содержать только числовые знаки и оставаться недопустимой для типа, где используется метод TryParse . Например, "256" не является допустимым значением для byte , однако оно допустимо для int . "98,6" не является допустимым значением для int , однако оно допустимо для decimal .
Пример
В следующем примере показано использование TryParse со строковыми представлениями значений long , byte и decimal .
Отказоустойчивость
Простые числовые типы также реализуют статический метод Parse , который вызывает исключение, если строка не является допустимым числом. В целом оператор TryParse более эффективен, поскольку если число не является допустимым, он просто возвращает значение "false".
Для проверки данных, введенных пользователем в такие элементы управления, как текстовые поля и поля со списком, всегда следует использовать метод TryParse или Parse .
Читайте также: