所以我写了这个非常简单的程序:
#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 缓冲区中读取内容或查询用户。
我知道这是一个简单的问题,但是它用于做作业......而且我正处于一个大规模的工作诱导时间之中,所以对于那些拥有权力的人来说,这是一种荣耀!
答案 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}}