C++
 Computer >> コンピューター >  >> プログラミング >> C++

C++で入力を読み取った後にcin.clear()とcin.ignore()を呼び出す理由とは?

はじめに

C++では、標準入力ストリームであるcinを使ってユーザーからの入力を受け取ります。しかし、プログラムの実行中に何らかの原因でエラーフラグがセットされると、cinが正常に動作しなくなることがあります。具体的には、入力をまったく受け付けなくなったり、意図しない文字を読み込んでしまったりするケースが発生します。

このような問題を解決するために活躍するのが、cin.clear()cin.ignore()という2つの関数です。本記事では、それぞれの役割と使い方について詳しく解説します。

cin.clear()の役割:エラーフラグのリセット

cin.clear()は、入力ストリームに設定されたエラーフラグ(failbitやeofbitなど)をリセットする関数です。エラーフラグが立ったままの状態では、たとえ正しいデータが入力されても、getline()get()などの入力関数が一切機能しなくなります。

clear()を呼び出してエラーフラグを解除することで、ストリームは再び正常な状態に戻り、以降の入力処理を継続できるようになります。

使用例

cin.clear();

cin.ignore()の役割:不要な文字の読み捨て

cin.ignore()は、ストリームから指定した文字数を読み飛ばす(破棄する)ための入力ストリーム関数です。エラーフラグをクリアしても、バッファには不正な文字や改行コードなどが残っている場合があります。これらを取り除かないと、次の入力操作で同じ問題が再発してしまうため、ignore()と組み合わせて使うのが定石となっています。

基本的な使い方

以下のように記述すると、最大1000文字を読み飛ばします。ただし、その途中で改行文字'\n'が見つかった場合は、そこまでの文字だけを破棄して処理を終了します。

cin.ignore(1000, '\n');

この書き方は「バッファに残っている内容を、1行分まるごとクリアする」という目的でよく利用されます。特に、数値入力の後にgetline()で文字列を読み込みたい場合など、入力バッファに改行が残ってしまう場面で非常に有効です。

まとめ

  • cin.clear():エラーフラグをリセットし、入力ストリームを再び使える状態に戻す。
  • cin.ignore(1000, '\n'):最大1000文字、または改行文字が見つかるまでの文字を読み捨てる。

この2つの関数を適切に組み合わせることで、C++における標準入力のトラブルを効果的に回避できます。入力処理がうまくいかないときは、まずエラーフラグの状態とバッファの残り内容を疑ってみるとよいでしょう。

  1. 【C++入門】cin・cout・cerrストリームの基本と使い方を徹底解説

    C++の標準入出力ストリームとは? C++におけるcin、cout、cerr、clogは、標準入力と標準出力を扱うためのストリームです。これらはすべて、iostreamヘッダファイルで定義されているストリームオブジェクトであり、C++プログラミングにおける入出力処理の基礎となります。 std::cin(標準入力ストリーム) std::cinは、istreamクラスのオブジェクトで、char型などのナロー文字に対応した標準入力ストリームを表します。C言語のstdinに相当します。標準入力ストリームは、環境によって決定される文字の入力元であり、通常はキーボードやファイルなど外部ソースからの入力と

  2. 【C++入門】標準入力ストリーム(std::cin)の使い方をわかりやすく解説

    std::cinは、char型などのナロー文字(半角文字)を扱う標準入力ストリームを表す、istreamクラスのオブジェクトです。C言語のstdinストリームに相当するものです。標準入力ストリームとは、実行環境によって決定される文字の入力元を指し、一般的にはキーボードやファイルなど、外部ソースからの入力であるとみなされます。 std::cinはistreamクラスのオブジェクトであるため、抽出演算子(operator>>)を使って書式化されたデータとして文字を読み取ることもできますし、readなどのメンバー関数を使って書式化されていない生データとして読み取ることも可能です。なお、こ