takahiro_itazuriの公倍数的ブログ

本やWebを通して学習したことをまとめるブログです。最大公約数(つまり、共通部分)的なという表現と対比して、「なるべく包括的にカバーしつつ、更に+αの要素も加えられたらいいな」という意味で公倍数的ブログと名付けました。

【就プロ】C++標準入出力

はじめに

今回はC++における入出力について記事を書きます。
Cの頃から利用されていたscanfやprintfと、C++で登場したcinやcoutの違いに着目して書きたいと思います。

scanfとprintf

stdio.hをインクルード。iostreamでも可。

scanf

以下のようにして使用します。

int a, b;
scanf("%d %d", &a, &b);

1. 入力を受け取るための変数を用意する
2. scanf関数にフォーマットと変数のアドレスを渡す

scanfの第一引数の文字列には、フォーマット指定子を利用します。
フォーマット指定子とは、入力の型や桁数を指定することができます。
フォーマット指定子はたくさんあるので、以下のサイトなどで確認しましょう。

printf

以下のように使います。

int a = 10;
printf("a is %d\n", a);

scanfと同様にフォーマット指定子を使用します。

cinとcoutとgetline

iostreamをインクルード。

cin

入力を空白または改行ごとに区切って代入していく。

int a, b;
std::cin >> a >> b;

cout

以下のようにして使用します。

int a = 10;
std::cout << "a is " << a << endl;

getline

getlineは一行を文字列に代入することができます。

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

cinとgetlineの併用

cinを使用した後にgetlineを仕様すると、getlineで取得した文字列には何も入っていないということが発生します。
その原因は、cinは改行文字の前で入力が終わっているため、現在位置から改行までを読み込むgetlineを使用すると、空の文字列になってしまうからです。
併用したい場合には、以下のようにします。

int n;
std::string s;

std::cin >> n;
std::cin.ignore(); // 次の改行文字まで最大1文字読み捨てる

std::getline(std::cin, s);

scanf vs cin

scanfとcinは基本的に機能に違いはありません。
それぞれ以下のような特徴があります。

cinの特徴

  • 空白または改行区切りの入力を簡単に読み込める
  • フォーマット指定子を必要とせず、型を自動で判定してくれる

scanfの特徴

  • フォーマット指定子を使用することで、より詳細な入力条件を加えることができる
  • 空白や改行区切りでない入力に対して使用できる
  • 若干cinより速い

余談

大量のデータを入力する場合には、cinを使うのはおすすめしません。
できればscanfを使用するようにしてください。

どうしても使いたい場合は、冒頭で以下のコード記述すると少し速くなります。

cin.tie(0);
ios::sync_with_stdio(false);