getlineで安全に入力を読み取る
std::getlineで行入力を受け取り、使用する前にユーザー入力を検証します。
「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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- std::cinとstd::coutの適切な使い方
- iomanipによる出力の書式設定
- getlineで安全に入力を読み取る
- std::cerrとstd::clogを扱う