C++ プログラミング

C++ でカンマ区切りの入力を読み込む:サンプルコードと行ごとの詳解 📝

以下は、最初に整数 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
  • 処理の流れ
    1. N = 3(改行を捨てる)
    2. apple → カンマで区切られ apple
    3. banana → 次のカンマで区切られ banana
    4. 最後の orange をまとめて getline で受け取り
  • 出力 nginxコピーする編集するapple banana orange

✅ まとめ

  • cin >> N; の後には必ず getline(cin, dummy); を入れて、改行文字を捨てる習慣をつけると安全です。
  • getline(cin, S, ',') を使えば、標準ライブラリだけで簡潔にカンマ区切りを処理できます。
  • <bits/stdc++.h> などの競技向けの技術もありますが、業務用途や移植性を意識する場面では個々のヘッダーに分けて記述すべきです。

-C++, プログラミング

Copyright© donguri.pyのblog , 2025 All Rights Reserved.