我正在尝试一个'stringstream'程序,如下所示:
#include <iostream>
#include <sstream>
using namespace std;
int main()
{
int x;
char ch;
std::string myString;
cout<< "input an integer:-" << endl;
while (getline ( cin, myString ))
{
std::istringstream strin(myString);
strin >> x;
if (!strin)
{
cout << "Bad 1 input \'" << strin.str() << "\'" << endl;
}
else if ( strin >> ch )
{
cout << "Bad 2 input \'" << ch << "\'" << endl;
}
else
{
cout << "You entered: " << x << endl;
break;
}
}
cout<< "good";
return 0;
}
输出:
input an integer:-
he is there
Bad 1 input 'he is there'
5.0
Bad 2 input '.' // problem 1
2 3
Bad 2 input '3' // problem 2
2 string
Bad 2 input 's' // problem 3
c string
Bad 1 input 'c string'
string 2
Bad 1 input 'string 2' // problem 4
5
You entered: 5
good
因为我在这里标记了我的问题,所以他们去了:
问题1 :为什么输入1输入不错?也为什么ch等于'。'如果抛出错误的输入2,则不是0?
问题2 :为什么输入1输入不错?为什么ch等于3?
问题3 :为什么输入1输入不好(再次)? (这也问为什么输出给出's'而不是'2 string')
问题4 :为什么输出与问题3不相似?
我无法弄清楚为什么会这样。
答案 0 :(得分:2)
Stringstream以字符为基础解析输入。如果它开始解析一个int,这是在问题#1-3期间发生的事情,它就不会抛出badinput 1。
它使用的过程就是这个。
'\0'
还是空格
\0
&#39;或更多的空格,错误二。因此,问题#:
5
),因此避免了错误1。但由于第二个是'.'
,它在输入结束之前遇到了一个坏字符。2
),因此避免了错误1。但是下一个字符是一个后跟'3'
的空格,它不能生成一个int,导致错误2. '2'
,一个数字。这里没有错误。然后你有一个空格,然后是's'
。这里没有int。错误2。's'
,显然不是数字。错误1。