Основы C/C++

Чтение и проверка ввода в C и C++

В этом уроке вы прочитаете данные, которые вводит пользователь, и отклоните неверные значения и на C, и на C++.

Введение

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

Главное

  • Включите предупреждения компилятора (compiler warnings) и исправьте их все.
  • Хорошо понимайте тип и время жизни (lifetime) каждого значения.
  • Всегда проверяйте входные данные и границы индексов массивов.

Примеры кода на C и C++

C
Запустить →
main.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
C++
Запустить →
main.cpp
#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 использует небольшие процедурные функции и открыто показывает, как данные представлены в памяти.

C++

C++ по-прежнему позволяет работать на низком уровне, но добавляет библиотечные типы и более безопасные абстракции.

Упражнения для практики

Запустите обе версии, а затем измените код, чтобы увидеть разницу в безопасности, которую даёт каждый язык.

  • Проверьте неверный ввод и граничные значения.
  • Скомпилируйте с флагами -Wall -Wextra -Wpedantic, чтобы включить больше предупреждений.
  • Вынесите общие объявления в заголовочный файл, а реализацию в отдельный файл.

Попрактикуйтесь на задаче

Примените материал этого урока к реальной задаче. Каждая задача запускается в браузере, с мгновенными тестами и разбором от ИИ.

Все задачи