C++ で ignore() 関数を使用する

胡金庫 2023年10月12日
  1. コマンドラインの不要なユーザ入力を破棄するために ignore() 関数を使用する
  2. C++ でユーザ入力の頭文字を抽出するには ignore 関数を用いる
C++ で ignore() 関数を使用する

この記事では、C++ で ignore() 関数を使用する方法をいくつか説明します。

コマンドラインの不要なユーザ入力を破棄するために ignore() 関数を使用する

関数 ignore()std::basic_istream のメンバ関数であり、異なる入力ストリームクラスから継承されます。この関数は、指定された区切り文字までのストリーム中の文字を破棄し、ストリームの残りの文字を抽出します。

最初の引数は抽出する文字数であり、2 番目の引数はデリミタ文字です。

次の例は、cin オブジェクトに対して ignore 関数を呼び出し、3つの数値のみを格納し、それ以外のユーザ入力を破棄する方法を示しています。なお、ignore 関数の第一引数に numeric_limits<std::streamsize>::max() を用いて、特殊文字を強制的に格納し、文字数パラメータを無効にしていることに注意してください。

#include <fstream>
#include <iostream>
#include <limits>
#include <sstream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::istringstream;
using std::numeric_limits;
using std::string;

int main() {
  while (true) {
    int i1, i2, i3;
    cout << "Type space separated numbers: " << endl;
    cin >> i1 >> i2 >> i3;
    if (i1 == 0) exit(EXIT_SUCCESS);
    cin.ignore(numeric_limits<std::streamsize>::max(), '\n');
    cout << i1 << "; " << i2 << "; " << i3 << endl;
  }
  return EXIT_SUCCESS;
}

出力:

Type space separated numbers:
238 389 090 2232 89
238; 389; 90

C++ でユーザ入力の頭文字を抽出するには ignore 関数を用いる

ignore 関数を利用する一般的な方法は、入力ストリームを任意の区切り文字まで探し、必要な文字だけを抽出することです。

以下のコードサンプルでは、スペースで区切られた文字列の頭文字のみが抽出されるようにユーザ入力が解析されています。ストリームから 1 文字を抽出するために cin.get を 2 回使っていますが、その間にある cin.ignore 文によって、次のスペースを含む前の文字はすべて破棄されます。

#include <fstream>
#include <iostream>
#include <limits>
#include <sstream>
#include <vector>

using std::cin;
using std::cout;
using std::endl;
using std::numeric_limits;
using std::string;
using std::vector;

int main() {
  char name, surname;
  cout << "Type your name and surname: " << endl;
  name = cin.get();
  cin.ignore(numeric_limits<std::streamsize>::max(), ' ');
  surname = cin.get();

  cout << "Your initials are: " << name << surname << endl;

  return EXIT_SUCCESS;
}

出力:

Type your name and surname:
Tim Cook
Your initials are: TM
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ IO