从逗号分隔的字符串解析整数

时间:2015-03-20 23:56:38

标签: c++ string iostream istream

我是c ++的新手并试图找到一些示例代码来从逗号分隔的字符串中提取整数。我遇到了这段代码:

std::string str = "1,2,3,4,5,6";
std::vector<int> vect;

std::stringstream ss(str);

int i;

while (ss >> i)
{
    vect.push_back(i);

    if (ss.peek() == ',')
        ss.ignore();
}  

我无法理解while循环条件语句:ss >> i。根据我的理解,istream::>>返回操作的istream。可以通过操作设置错误位。似乎没有涉及布尔变量。 ss >> i如何作为条件陈述?

此外,>>提取一个或多个字符吗?例如,如果我有一个字符串&#34; 13,14&#34;。此操作是返回整数1,3,1,4还是整数13,14?

非常感谢, 中号

3 个答案:

答案 0 :(得分:2)

  

ss >> i如何作为条件陈述?

std::basic_ios(所有标准流的基类)都有explicit operator bool(),返回!fail()。它的目的是指示流处于有效状态并可以进一步使用。

  

此外,>>是否会提取一个或多个字符?

取决于您阅读的对象的类型。对于数字,它基本上可以提取尽可能多的字符。您可以详细阅读规则here

答案 1 :(得分:2)

1)条件声明。

std :: stringstream派生自std :: ios,它定义:

  • 在C ++ 98 / C ++ 03中:operator void *()const

描述:如果设置了failbit或badbit中的至少一个,则为空指针。否则还有其他一些价值。

  • 在C ++ 11中:显式运算符bool()const

说明:如果未设置failbit或badbit,则为true。否则就是假的。

这就是为什么你可以使用这个表达式作为循环的条件 - 运算符&gt;&gt;返回对stringstream对象的引用,然后根据支持的C ++版本将其转换为void * pointer或bool。

有关此内容的更多信息:std::ios::operator bool

2)运算符&gt;&gt;申请数字提取尽可能多的字符:

int main()
{
    std::string str = "111,12,1063,134,10005,1226";
    std::vector<int> vect;

    std::stringstream ss(str);

    int i;

    while (ss >> i)
    {
        vect.push_back(i);

        if (ss.peek() == ',')
            ss.ignore();
    }

    return 0;
}

载体含量:[111,12,1063,134,10005,1226]。

再次提供更多信息:std::istream::operator>>

答案 2 :(得分:0)

运营商&gt;&gt;在stringstream中继承自istream。 istream的文档说返回值是istream对象[1]。我做了一个快速测试,返回值是一个void *(可能是stream对象)。我也看到当流耗尽时(最后)返回值为NULL(这是我的测试,我在文档中找不到它)。所以这可能解释了while循环的行为,因为void *和NULL可以转换为bool。 只需将循环更改为 while(void * x =(ss&gt;&gt; i)){}你可以自己获得返回值。

你的第二个问题的答案在下面的链接中说&#34;从流中依次提取和解析字符,将它们解释为正确类型值的表示,存储为值val。&#34;因此在这种情况下,它将提取尽可能多的字符以将其转换为整数。

[1] http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/