🌲

c++で標準入力が1行だけカンマ区切りの時の読み込み

2022/08/27に公開

背景

Atcoderなどの有名コンテストではあまり出ない(?)と思われるのですが、
先日目にする機会があり、cinとgetlineの併用方法が調べてもすぐに出てこなかったので書いておきます。
(ググり力の無さのせいもある...)

入力例

3
1 5,6 7,9 13

読み込み方

//読み込み部分
int n; cin >> n; cin.ignore(); //これが大事❗️
cout << n << endl;
string s; getline(cin, s); //文字列で読み込む

//カンマ区切りの処理を行う
stringstream ss{s};
vector<string> sv;
while ( getline(ss, s, ',') ){     // スペース(',')で区切って,格納
	sv.push_back(s);
}
for (const string& s : v){         // vの中身を出力
        cout << s << endl;
}

出力

3
1 5
6 7
9 13

余談と仕組み

カンマ区切り c++
みたいに調べるとgetline()を使おうねという結果がたくさん出るんですが、
cinを使用した直後にgetlineを仕様すると、getlineで取得した文字列には何も入っていないということが発生します。

参考文献によると、

その原因は、cinは改行文字の前で入力が終わっているため、現在位置から改行までを読み込むgetlineを使用すると、空の文字列になってしまうからです。

だそうです。
つまり、getlineには改行文字が返ってきてしまうので、
cin.ignore()で改行文字を読み捨てる一手間が必要ですよというお話でした。

Discussion