Чтение и проверка ввода в C и C++
В этом уроке вы прочитаете данные, которые вводит пользователь, и отклоните неверные значения и на C, и на C++.
Введение
Чтение ввода всегда может завершиться неудачей, например когда программа ждёт число, а пользователь вводит буквы. Поэтому программа должна проверять результат чтения, а не считать, что данные всегда правильные.
Главное
- Включите предупреждения компилятора (compiler warnings) и исправьте их все.
- Хорошо понимайте тип и время жизни (lifetime) каждого значения.
- Всегда проверяйте входные данные и границы индексов массивов.
Примеры кода на C и C++
#include <stdio.h>
int main(void) {
int age;
printf("Age: ");
if (scanf("%d", &age) != 1 || age < 0) {
puts("Invalid age");
return 1;
}
printf("Next year: %d\n", age + 1);
return 0;
}
Age: 20
Next year: 21
#include <iostream>
int main() {
int age;
std::cout << "Age: ";
if (!(std::cin >> age) || age < 0) {
std::cerr << "Invalid age\n";
return 1;
}
std::cout << "Next year: " << age + 1 << '\n';
}
Age: 20
Next year: 21
Сравнение C и C++
В C функция scanf возвращает число успешно прочитанных значений, поэтому условие scanf(...) != 1 означает, что прочитать возраст не удалось. В C++, если std::cin не может прочитать данные нужного типа, он переходит в состояние ошибки, и проверяющее выражение становится ложным. Обе программы также отклоняют отрицательный возраст.
C использует небольшие процедурные функции и открыто показывает, как данные представлены в памяти.
C++ по-прежнему позволяет работать на низком уровне, но добавляет библиотечные типы и более безопасные абстракции.
Упражнения для практики
Запустите обе версии, а затем измените код, чтобы увидеть разницу в безопасности, которую даёт каждый язык.
- Проверьте неверный ввод и граничные значения.
- Скомпилируйте с флагами -Wall -Wextra -Wpedantic, чтобы включить больше предупреждений.
- Вынесите общие объявления в заголовочный файл, а реализацию в отдельный файл.
Попрактикуйтесь на задаче
Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.
- Среднее из трёх Вычислите среднее трёх целых чисел. Легко
- Rectangle Perimeter Compute the perimeter of a rectangle from its sides. Легко