1

だから私はこの非常に単純なプログラムを書きました:

#include <iostream>
#include <string>
using namespace std;

int main()
{
string input;

cin >> input;
cout<< input<<endl;
cin >> input;
cout<< input<<endl;
cin >> input;
cout<< input<<endl;
return 0;
}

1行に「word1word2word3」と入力すると、期待どおりの出力が得られます。

word1
word2
word3

もちろん、今はと同じ出力を得ることができましたfor (int i=0; i <3; i++){cin>>input; cout << input<<endl;}

それは私の質問に私をもたらします。cinがstdinから読み取るものがなくなるとすぐに、ユーザー(stdin)にクエリを実行します。

cinがstdinバッファーから何かを読み取るか、ユーザーに照会するかを検出する方法です。

私はそれが簡単な質問であることを知っていますが、それは宿題のためです...そして私は大規模な仕事に起因する時間の危機に瀕しているので、力を共有する人には称賛を送ります!

4

1 に答える 1

2

operator>>異なる種類の空白を区別しないという理由だけで、あなたがやろうとしていることを行うことはできません。お気に入りのC++標準ライブラリの実装を見てください。以下はgcc4.7.2の(bits/basic_string.tcc)からのものです。

 995   // 21.3.7.9 basic_string::getline and operators
 996   template<typename _CharT, typename _Traits, typename _Alloc>
 997     basic_istream<_CharT, _Traits>&
 998     operator>>(basic_istream<_CharT, _Traits>& __in,
 999            basic_string<_CharT, _Traits, _Alloc>& __str)
1000     {
...
1027           while (__extracted < __n
1028              && !_Traits::eq_int_type(__c, __eof)
1029              && !__ct.is(__ctype_base::space,
1030                  _Traits::to_char_type(__c)))
1031         {

ご覧のとおり(1029行目)、これは検出されたすべての空白で停止します(http://en.cppreference.com/w/cpp/locale/ctype_baseを参照ctype_base::space)。

したがって、あなたがしたいのは、(改行に遭遇すると停止する)を使用し、 :getlineを介して抽出することです。stringstream

getline(cin,mystring);
stringstream str(mystring);
while (str >> token) {
  cout << token << '\n';
}
于 2013-02-19T05:53:09.113 に答える