Как проверить что введено число c
Перейти к содержимому

Как проверить что введено число c

  • автор:

Проверка вводимых потоковых данных С++

Если данные вводятся в формы – то правильный путь – использование валидаторов. Если данные считываются с файла в JSON/XML форматах используйте JSON-схему или XSD/DTD. Ну а эта инструкция посвящена работе с потоками типа cin, ifstream.

Валидация ввода чисел

Итак, мы считали целое число с консоли:

int a; cin >> a;

Что если пользователь ввел не целое число или строку? При этом поднимется флаг ошибки потока cin. Не вдаваясь в подробности, проверить его можно функцией cin.fail() . Но нам надо не просто проверить, а попросить пользователя ввести данные еще раз. Перед следующей попыткой ввода надо снять флаг ошибки функцией cin.clear() и удалить все находящиеся в нем данные. Для удаления данных можно использовать такую конструкцию: cin.ignore(cin.rdbuf()->in_avail()); или такую: cin.sync(); тут функция rdbuf возвращет буфер, а in_avail – количество байт в нем. Однако, это работает не всегда (не во всех компиляторах), in_avail часто возвращает некорректные значения. Вместо этого можно передать в ignore любое большое число, задающее число байт, которые надо пропустить. Удобен и переносим такой вариант: std::cin.ignore(std::numeric_limits::max(), ‘\n’); Итого, чтобы считать целое число используем такую конструкцию:

int a; cin >> a; while (cin.fail())< cin.clear(); std::cin.ignore(std::numeric_limits::max(), '\n'); cout > a; >

Валидация ввода строки

Допустим, мы думаем, что в файле находится строка не более чем из N символов. Считаем ее так:

char s1[N]; cin.getline(s1, N,'\n');

Что может пойти не так? – На самом деле, мы считываем строку не более чем из N символов или до символа перевода строки. Если перед этим мы считали с клавиатуры число (например как описано выше) – то в буфере остается символ перевода строки, так как оператор >> не удаляет его из потока. Часто для этого выполняют что-то типа cin.get() , однако более надежно вызвать что-то типа std::cin.ignore(std::numeric_limits::max(), ‘\n’); Ну а что если пользователь ввел строку из более чем N символов? Проблема в том, что сама собой она не обрежется, а самое главное – в этом случае поднимется флаг ошибки ( cin.fail ) и любое последующее обращение к потоку сломает вашу программу. итак, мы пришли к такому варианту:

char s1[N]; std::cin.ignore(std::numeric_limits::max(), '\n'); cin.getline(s1, N,'\n'); if (cin.fail()) < cin.clear(); std::cin.ignore(std::numeric_limits::max(), '\n'); >

Этот вариант считывает с потока строку (не более чем из N символов), а остальные – игнорирует (до символа перевода строки). Однако, если вы хотите при некорректном ввода попросить пользователя ввести данные повторно, используйте такой вариант:

char s1[N]; std::cin.ignore(std::numeric_limits::max(), ‘\n’); cin.getline(s1, N,’\n’); while (cin.fail()) < cin.clear(); std::cin.ignore(std::numeric_limits::max(), '\n'); cout

Как проверить что введено число c

Здравствуйте. У меня вопрос. Как можно организовать в языке Си проверку на ввод числа т.е. если мы введем букву или иные символы вместо числа то должно выдать ошибку.
Заранее спасибо.

Snifer1994
Посмотреть профиль
Найти ещё сообщения от Snifer1994

Белик Виталий 🙂
Регистрация: 23.07.2007
Сообщений: 57,097

Переведи строку в число. Если функция перевода вернет ошибку значит нужно уведомить пользователя. Функций перевода в число множество — выбирай какая по вкусу из хелпа своего компилятора..

I’m learning to live.
Регистрация: 14.08.2012
Сообщений: 3

Не знаю по поводу перевода строки в число. А нету способа полегче?
Вот нашел на просторах интернета этот способ но не могу понять как он работает?
Сможет кто нибудь объяснить принцип его работы.

void main()
Snifer1994
Посмотреть профиль
Найти ещё сообщения от Snifer1994

Белик Виталий 🙂
Регистрация: 23.07.2007
Сообщений: 57,097

Эта функция умеет возвращать в качестве результата код ошибки, если введенное нельзя сравнить с шаблоном формата. Короче если введенное не является числом по формату %d (т.е. не целое) то выдать ошибку.
Можно и так, если scanf-ом не брезгуешь.

I’m learning to live.

Как проверить число ли подается на вход?

Как сделать условие, чтобы проверить входные данные на число. Есть isdigit , но либо я не понимаю его работу, либо он не правильно работает.
Фрагмент кода:

int main() < SetConsoleCP(1251); SetConsoleOutputCP(1251); struct DATA student_group[30]; int i = 1, count_students, check; Step1: cout > count_students; check = count_students % 10; if (!(isdigit(check)))

Вывод, если ввести что-то, кроме цифр, например «ыфв»:

626ea39662202688267338.png

  • Вопрос задан более двух лет назад
  • 398 просмотров

Комментировать
Решения вопроса 1
«I’m here to consult you» © Dogbert

проверяет, является ли символ цифрой или нет. Помогло бы вам, если бы вы получали из стандартного ввода строку и сами переводили её в число. Но нет, операция

int count_students; cin >> count_students;

вводит не строку, а число.

Чтобы проверить, был ли ввод успешным или нет можно вызвать cin.fail(), типа того:

cin >> count_students; if (cin.fail())

Проверка на ввод именно числа

Author24 — интернет-сервис помощи студентам

Проверка на ввод числа
Помогите сделать проверку на ввод числа. Если введены буквы, то выводится ошибка и нужно ввести.

Проверка на ввод числа
Есть задание: Создайте приложение для обучения малышей устному счету. Программа должна.

Проверка на ввод числа
У меня есть поле для вставки стоимости услуги: <input type="text" required name="price" size="20".

2307 / 1133 / 702
Регистрация: 25.04.2016
Сообщений: 3,229

1 2 3 4 5 6 7 8 9 10 11 12
#include int main (void) { int n; printf("n = "); scanf("%d", &n); printf("You input %d\n", n); return 0; }

функция scanf при вводе числа с точкой обрежет дробную часть, при вводе буквы, запишет 0, таким образом вы гарантированно получите целое число в n

296 / 227 / 102
Регистрация: 11.08.2016
Сообщений: 780

stake-k26, а если я ввел бы 0? Это ведь тоже цифра? Результат получается будет одиноковым .
Может лучше получать ввод всегда, но использовать функцию isdigit? Результатом проверки будет либо ИСТИНА, либо ЛОЖЬ.

ЗЫ, перечитал ТЗ и понял, что врятли . здесь будет исключительно проверка на цифру, но десятичная тоже будет цифра ..

2307 / 1133 / 702
Регистрация: 25.04.2016
Сообщений: 3,229

D3m1an, тут все зависит от того,ч то именно нам нужно? Вернее не нам, а ТС. Если ему необходимо, чтобы программа остро реагировала на все, что она получает с клавиатуры, то тут вообще лучше использовать
while((c=getchar()) != ‘\n’) if (c>=’0′ && c

А если ему нужно просто обезопасить программу от попадания в нее неправильного значения, то тут и scanf хватит. Да, возможно программа будет неправильно считать, но зато это не приведет к сбою в программе.

Еще можно сделать, например вот так:

1 2 3 4 5 6 7 8 9 10 11 12 13
#include int main (void) { int n; printf("n = "); int test = scanf("%d", &n); printf("You input %d\n", n); printf("test is %d\n", test); return 0; }

В случае ввода буквы, в test будет записано 0, в случае целого числа — будет 1

Т.е. мы можем сделать, например вот так:

1 2 3 4 5 6 7 8 9 10 11
#include int main (void) { int n; printf("n = "); if (scanf("%d", &n)) printf("You input %d\n", n); return 0; }

И таким образом полностью исключим возможность ввода букв, а любое число с точкой будет обрезано до целого.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *