C++ Academy · レッスン

getlineで安全に入力を読み取る

std::getlineで行入力を受け取り、使用する前にユーザー入力を検証します。

レッスン 3/413 ステップ

「getlineで安全に入力を読み取る」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。

安全な入力が重要な理由

ユーザー入力は、クラッシュの最も一般的な原因です。型の間違い、空行、予期しない文字のいずれも、単純なプログラムを破綻させる可能性があります。防御的な入力処理は不可欠です。

std::getline の基本

std::getline(stream, line) は、次の改行までの文字を読み取ります。改行は消費されますが、保存はされません。

std::string line;
std::getline(std::cin, line);

カスタム区切り文字

3 番目の引数を渡すと、改行に限らず任意の文字で読み取りを停止できます。

std::string field;
std::getline(std::cin, field, ',');

数値入力を検証する

まず行全体を読み取り、その後で解析します。これにより、入力が不正な場合に cin が失敗状態になることを避けられます。

std::string line;
int n;
if (std::getline(std::cin, line)) {
    try {
        n = std::stoi(line);
    } catch (...) {
        std::cout << "Invalid number\n";
    }
}

有効になるまで繰り返す

getline と try/catch を組み合わせ、ユーザーが有効な入力を指定するまでプロンプトを表示し続けます。

int age;
while (true) {
    std::cout << "Age: ";
    std::string line;
    std::getline(std::cin, line);
    try {
        age = std::stoi(line);
        if (age >= 0 && age < 150) break;
    } catch (...) {}
    std::cout << "Try again.\n";
}

getline で EOF を検出する

EOF になると、getline はストリームを失敗状態にします。呼び出し後にストリームを確認してください。

std::string line;
while (std::getline(std::cin, line)) {
    process(line);
}

空白をトリミングする

ユーザーは余分なスペースを入力しがちです。読み取り後に両端の空白を削除してください。

void trim(std::string& s) {
    size_t start = s.find_first_not_of(" \t\r\n");
    size_t end   = s.find_last_not_of(" \t\r\n");
    s = (start == std::string::npos) ? "" : s.substr(start, end - start + 1);
}

ストリームをクリアする

>> と getline を混在させる場合は、先に残った文字をクリアしてください。

std::cin.clear();
std::cin.ignore(std::numeric_limits<std::streamsize>::max(), '\n');

1 行から複数の値を読み取る

まず行全体を読み取り、それを stringstream に渡して値を取り出します。

std::string line;
std::getline(std::cin, line);
std::istringstream iss(line);
int a, b, c;
iss >> a >> b >> c;

最大長による防御

意図しないリソース枯渇を防ぐため、長すぎる入力は早い段階で拒否してください。

std::string line;
if (std::getline(std::cin, line) && line.size() > 1024) {
    std::cout << "Input too long.\n";
    return 1;
}

パスワードや非表示の入力を読み取る

標準ライブラリには、入力内容のエコー表示を非表示にする機能はありません。パスワード入力では、Unix の termios や Windows の SetConsoleMode など、プラットフォーム API を使用してください。

確認問題

std::cin >> n ではなく、getline で読み取ってから解析するほうが安全なのはなぜですか。

まとめ

std::getline でユーザー入力を読み取り、検証または解析を別に行い、空白をトリミングします。解析は try/catch で囲み、有効な値を取得するまで繰り返してください。抽出と行読み取りを混在させる場合は、ストリームをクリアします。

無料で開始

AI チューターと学ぶ C++ — 無料

ブラウザでリアルコードを書いて実行し、24/7 の AI チューターから瞬時にサポートを受け、ウェブまたはアプリで続きから学習できます。

コース
51
レッスン
203

よくある質問

「getlineで安全に入力を読み取る」レッスンは無料ですか?

はい。「getlineで安全に入力を読み取る」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。

「getlineで安全に入力を読み取る」で何を学びますか?

std::getlineで行入力を受け取り、使用する前にユーザー入力を検証します。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

C++ Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「getlineで安全に入力を読み取る」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このC++ Academyレッスンでコードを書いて実行できますか?

はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. std::cinとstd::coutの適切な使い方
  2. iomanipによる出力の書式設定
  3. getlineで安全に入力を読み取る
  4. std::cerrとstd::clogを扱う
← C++ Academyに戻る