【就プロ】C++標準入出力
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);