ロコリンの雑記

アニメ大好きニートのロコリンのブログ。2015年卒(修士)の社会人。学生時代(2010年)から続けてるブログなのでエントリによっては学生ブログと社会人ブログになっています。時系列から察して。
 
 
このブログについて
ブログ内検索
カテゴリ
プロフィール

ロコリン

Author:ロコリン
2018年5月だけニート(6月から会社員)。2015年3月まで大学院生でした。
趣味:アニメ/Twitter/ゲーム/ニコ動
今(2015年2月更新):プリキュア/プリパラ/アイカツ/ごちうさ/艦これ

外部リンク
Twitter

スポンサーサイト 

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

[C++] getline を含むストリーム入力のトラブルとその解決 

次のプログラムは意図した通りには動きません。

getlineCinMix_dame.cpp

#include <string>
#include <iostream>

int main() {
	int a, b;
	std::string s;

	// 整数 a, b を入力し、そのあとで1行の文字列 s を入力したい。
	std::cin >> a >> b;
	std::getline(std::cin, s);

	std::cout << "a = " << a << std::endl;
	std::cout << "b = " << b << std::endl;
	std::cout << "s = " << s << std::endl;
	return 0;
}

整数 a, b を入力した後に改行を加えて1行の文字列を入力すると、改行前の入力バッファ、すなわち空白が s に入力されます。ちょっと嫌です。

getline を含む入力ではこのようなトラブルによく遭遇します (少なくとも私は)。そのため、通常の入力と getline を混合しないべきであるという結論に至りました。でも getline を使わないわけにはいかないし、かといって通常の入力もしたいです。そんなときは istringstream を使うといいのではないでしょうか。

getlineCinMix.cpp

#include <string>
#include <iostream>
#include <sstream>

int main() {
	int a, b;
	std::string s;

	// 整数 a, b を入力し、そのあとで1行の文字列 s を入力したい。
	{
		std::string s;
		std::getline(std::cin, s);
		std::istringstream iss(s);
		iss >> a >> b;
	}
	std::getline(std::cin, s);

	std::cout << "a = " << a << std::endl;
	std::cout << "b = " << b << std::endl;
	std::cout << "s = " << s << std::endl;
	return 0;
}

これで意図したとおりに動きました。

スポンサーサイト
コメント















 管理者にだけ表示を許可する

トラックバック
 
http://rexpit.blog29.fc2.com/tb.php/86-2b9884f5
最新記事
最新コメント
FC2カウンタ
欲しい
最近買ったもの
Amazon 検索
 
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。