C++ stringstream 输入的各种结果

C++ various results of stringstream inputs

我正在尝试一个 '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 不相似?

我想不通为什么会这样。

Stringstream 按字符解析输入。如果它开始解析一个 int,这就是问题 #1-3 中发生的情况,它不会抛出 badinput 1。

它使用的过程是这样的。

  1. 第一个字符是数字(或符号)吗?
    • 如果是,存储并继续,否则,错误一;
  2. 下一个字符是数字吗?
    • 如果是,存储并继续,运行再执行第二步。
    • 如果不是,它是终端字符,即 '[=10=]' 或 whitespace
      • 如果是,很好。,但如果是白色space,如果还有任何其他字符,除了'[=11=]'或更多白色space,错误二。
      • 否则,错误二。

因此,在问题#:

  1. 由于第一个字符是数字 (5),因此避免了错误 1。但是由于第二个是'.',所以在输入结束前遇到了一个坏字符
  2. 第一个字符是数字(2),避免了错误一。但是下一个字符是一个space后面跟着'3',不能做成int,导致错误2.
  3. 第一个字符是'2',一个数字。这里没有错误。然后你有一个 space,然后是 's'。这里没有整数。错误 2.
  4. 这里第一个字符是's',显然不是数字。错误 1.