cin,空白和'缓冲'

时间:2013-02-19 04:11:31

标签: c++ stdin cin

所以我写了这个非常简单的程序:

#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;
}

我在一行输入'word1 word2 word3',输出正如

word1
word2
word3

当然,我可以获得与for (int i=0; i <3; i++){cin>>input; cout << input<<endl;}相同的输出。

这让我想到了我的问题。一旦cin用完了从stdin读取的东西,它就会查询用户(stdin)。

我可以检测cin是否会从stdin 缓冲区中读取内容或查询用户。

我知道这是一个简单的问题,但是它用于做作业......而且我正处于一个大规模的工作诱导时间之中,所以对于那些拥有权力的人来说,这是一种荣耀!

1 个答案:

答案 0 :(得分:2)

只有因为它不区分不同类型的空白而无法使用operator>>完成您要做的事情。查看您最喜欢的C ++标准库中的实现,以下内容来自gcc 4.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行),这会在遇到的所有空格上停止(请ctype_base::space查看getline)。

您要做的是使用stringstream(在遇到换行符时停止)并通过getline(cin,mystring); stringstream str(mystring); while (str >> token) { cout << token << '\n'; } 提取:

{{1}}