以下は、最初に整数 N
を読み取り、その後 入力ストリームをカンマ ,
で区切って 前方の N−1N-1N−1 個の要素を逐次出力し、最後に “残り” を標準出力に出すプログラムです。
#include <bits/stdc++.h>
using namespace std;
int main() {
int N;
cin >> N;
string S, dummy;
getline(cin, dummy);
for (int i = 0; i < N-1; ++i) {
getline(cin, S, ',');
cout << S << endl;
}
getline(cin, S);
cout << S << endl;
}
以下で 1 行ずつ丁寧に解説します。
1️⃣ #include <bits/stdc++.h>
- これは GNU C++(libstdc++)の非標準ヘッダーで、STL を含む実質すべての標準ヘッダーをまとめてインクルードするものです。
- コーディングコンテストでは便利ですが、可搬性がなく、コンパイル時間の増加も招くため、業務で使う場合は特定のヘッダー(例:
<iostream>
,<string>
,<vector>
)を個別にインクルードするのが推奨されます。
2️⃣ using namespace std;
std::cout
,std::string
などをstd::
を省略して直接使えるようにする宣言です。- 小規模なサンプルやコード競技ではよく使われますが、名前衝突の観点から大規模な開発環境では避けることが多いです。
3️⃣ int main() {
- プログラムのエントリーポイント。
return 0;
を省略すると、C++ の仕様で自動的にreturn 0;
が追加されます。
4️⃣ int N;
- カンマ区切りの要素数(
N
個)を読み込むための変数。
5️⃣ cin >> N;
- 整数を読み込む際に先頭の空白(スペースや改行)を自動で読み飛ばす処理を行います。
- ここで読み込まれたあと、改行文字(
'\n'
)が入力バッファに残る点に注意が必要です。
6️⃣ string S, dummy;
S
:カンマ区切りの各要素を格納するための文字列。dummy
:改行など余分な入力を受け取って破棄するためのダミー変数。
7️⃣ getline(cin, dummy);
cin >> N;
の後に残っている改行文字を読み込んで捨てる目的です。- もしこの行がないと、直後の
getline
が空行(空文字)を返してしまうことがあります。
8️⃣ for (int i = 0; i < N-1; ++i) { … }
- ここで 最初の N−1N-1N−1 要素を順に読み込みます。
- ループ回数が N−1N-1N−1 なのは、最後の要素(N番目)は後でまとめて読み込むためです。
9️⃣ getline(cin, S, ',');
- デリミタとしてカンマ
,
を指定したgetline
。 - 第 3 引数に
','
を与えることで、カンマが現れるまで読み込んでS
に格納し、そのカンマはストリームから消費されます(結果には含まれません)
🔟 cout << S << endl;
- 読み込んだ文字列
S
を出力し、改行 ('\n'
) を付けます。 endl
はさらにフラッシュ処理も行うため、多用は避ける場合もあります。
1️⃣1️⃣ }
(ループ終わり)
for (int i = 0; i < N-1; ++i)
のブロックを閉じています。
1️⃣2️⃣ getline(cin, S);
- デフォルトデリミタ(改行)を使って残り行を読み込みます。
- ループでカンマ区切りを N−1N-1N−1 回読み進めた後なので、最後のカンマの直後から行末までが
S
に格納されます。
1️⃣3️⃣ cout << S << endl;
- 最後の要素(N番目)を出力。
1️⃣4️⃣ }
(main
閉じ)
main
関数の終了を意味します。
🔧 補足と実践のポイント
ポイント | 注意点・工夫 |
---|---|
getline(cin, dummy); の必要性 | cin >> の直後必須。省略すると最初の行の読み込みが空文字になる。 |
getline の第 3 引数 | カンマ ',' を指定可能。これにより簡単にカンマ区切りを処理できる。 |
可搬性 | <bits/stdc++.h> や using namespace std; は便利だが、業務や他のコンパイラ(MSVC など)では使えないこともある。 |
最後のデリミタ | N 個目を扱うためにループを N-1 回にしている。カンマが最後に無かった場合に対応。 |
📌 実行例
//入力例
3
apple,banana,orange
//出力結果
apple
banana
orange
- 処理の流れ
N = 3
(改行を捨てる)apple
→ カンマで区切られapple
banana
→ 次のカンマで区切られbanana
- 最後の
orange
をまとめてgetline
で受け取り
- 出力 nginxコピーする編集する
apple banana orange
✅ まとめ
cin >> N;
の後には必ずgetline(cin, dummy);
を入れて、改行文字を捨てる習慣をつけると安全です。getline(cin, S, ',')
を使えば、標準ライブラリだけで簡潔にカンマ区切りを処理できます。<bits/stdc++.h>
などの競技向けの技術もありますが、業務用途や移植性を意識する場面では個々のヘッダーに分けて記述すべきです。