在char数组中使用sstream解析器整数

时间:2019-03-15 11:49:13

标签: c++

使用sstream解析char数组中的整数时,我困了几个小时。 我不知道在while循环中为什么还要再进行一次迭代。

//main.cpp
#include <iostream>
#include <sstream>
int main()
{
    char data[5] = "1 23";
    //char data[4] = {'1', ' ', '2', '3'};  another attempt
    std::stringstream stream;
    stream << data;
    int count = 1;
    while (stream)
    {
        double x = 0;
        stream >> x;
        std::cout << count << "  " << x << std::endl;
        count++;
    }
    return 0;
}

程序输出显示:

1  1
2  23
3  0

我使用follow命令来编译程序。

g++ main.cpp

我认为有2个整数,所以只有2个迭代。我不知道为什么while循环中有3次迭代。我想这是因为char数组的末尾有'\ 0',但是我试过了,它得到了相同的结果。

有什么建议吗?谢谢。

2 个答案:

答案 0 :(得分:2)

您没有检查stream >> x是否成功:

if (stream >> x)
{
    std::cout << count << "  " << x << std::endl;
    count++;
}

会做。

您还可以将其包括在循环中:

double x = 0;
while (stream >> x)
{
    std::cout << count << "  " << x << std::endl;
    count++;
}

答案 1 :(得分:1)

  

我认为有2个整数,所以只有2个迭代。我不知道为什么while循环中有3次迭代。

  • 第一次迭代:流处于良好状态。您提取一个整数。您可以打印整数,而不检查提取是否成功。
  • 第二次迭代:流处于良好状态。您提取一个整数。您可以打印整数,而不检查提取是否成功。
  • 第三次迭代:流处于良好状态。您提取一个整数。您打印整数而不检查提取是否成功(没有成功)。
  • 第四次迭代:流处于失败状态。循环结束。

用于流提取的常规模式是:

while(stream >> variable) { // or if for single extraction
                            // use the extracted variable

这样,您始终在使用提取的值之前检查提取是否成功。


char data[4] = {'1', ' ', '2', '3'};  another attempt

将非空终止的字符串插入流后,此尝试将具有未定义的行为。