C ++字符串流输入的各种结果

时间:2015-06-18 20:10:27

标签: c++ stringstream

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

我无法弄清楚为什么会这样。

1 个答案:

答案 0 :(得分:2)

Stringstream以字符为基础解析输入。如果它开始解析一个int,这是在问题#1-3期间发生的事情,它就不会抛出badinput 1。

它使用的过程就是这个。

  1. 第一个字符是数字(或符号)吗?
    • 如果是,请存储并继续,否则出现错误;
  2. 下一个字符是数字吗?
    • 如果是,则存储并继续,再次运行第二步。
    • 如果不是,它是终端字符,即'\0'还是空格
      • 如果是,那么好,但如果它是空白,除非有其他字符,除了&#39; \0&#39;或更多的空格,错误二。
      • 否则,错误二。
  3. 因此,问题#:

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