🌲
c++で標準入力が1行だけカンマ区切りの時の読み込み
背景
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