C/C++の基礎

入力の読み取りと検証

入力処理は失敗するため、成功を仮定せず結果を確認します。

入力の読み取りと検証とは?

入力処理は失敗するため、成功を仮定せず結果を確認します。

ユーザー入力を読み、不正な値を拒否します。

重要なポイント

  • compiler warningを有効にしてすべて修正します。
  • 各値の型と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++の比較

scanfは変換成功数を返し、std::cinは要求型を読めないとfail stateになります。

C

Cは小さな手続き型APIと表現の詳細を明示します。

C++

C++は低レベルモデルを保ちつつ安全な型を追加します。

練習課題

両方を実行して変更し、言語ごとの保証を確認します。

  • 不正入力と境界値を追加します。
  • -Wall -Wextra -Wpedanticでコンパイルします。
  • 宣言と実装を分割します。