スポンサーサイト

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

C++のstd::cinを思い通りに動作させる。

参考サイト様: http://takagi.in/modules/cpp_guide5/index.php?id=7



散々悩んだstd::cinのoperator>>とgetlineの使い分け…
しかしそれはC言語よりの使者、「char[]」によりあっけなく解決いたしました。

もうstd::cinの1行取得が我々を悩ませる必要はありません!!


だめな例
std::string line;
std::getline(std::cin, line); // aa bb と入力
std::string hoge;
std::cin >> hoge; // 入力すっとばされて「bb」

これはstd::cinによる入力時に
バッファが現地点から空白前までしか読み飛ばされないからです。
つまりgetlineをした時点で、std::string lineは「aa bb」になりますが、
バッファには「aa 」まで読み飛ばしたまでも「bb」が残ります。

そして次の入力待ち「std::cin >> hoge;」(いわゆるoperator>>)が
バッファに残った「bb」を「なんだ、もう既に入力されてるじゃん」と解釈され、
入力スキップされます。(hogeは"bb"になる)

解決方法
char cline[1023];
std::cin.getline(line, sizeof(line)); // aa bb と入力
std::string line(cline); // 内容をstd::stringに持ち直し
std::string hoge;
std::cin >> hoge; // 入力待機

std::getlineとstd::cin.getlineは同じものと思っておいてください。
(少なくともここでは)

これでなぜ入力スキップされないのでしょうか…?
それはstd::cin.getline(line, sizeof(line))で
std::cinに明示的に「sizeof(line)分読み飛ばしてね」と命令しているからです!!

空白とか関係ありません、sizeof(line)分きっかり読み進めるからです。

最後に「cline」はchar[]型なのでstd::stringに持ち直しています。


以上!



あいやはプログラミング仲間を探しています。
スポンサーサイト

コメント

非公開コメント
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。