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

Parsing integer from comma delimited string

我是 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::>> returns istream 运行。操作可能会设置错误位。似乎没有涉及布尔变量。 ss >> i如何作为条件语句?

另外,>>是提取一个字符还是多个字符?例如,如果我有一个字符串“13, 14”。这个操作 return 整数 1, 3, 1, 4 还是整数 13, 14?

非常感谢, M

How can ss >> i serve as a conditional statement?

Class std::basic_ios(这是所有标准流的基础 class)有 explicit operator bool() 其中 returns !fail()。它的意义在于表明流处于有效状态并且可以进一步使用。

Additionally, does >> extract one or multiple characters?

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

1) 条件语句。

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

  • 在 C++ 98 / C++ 03 中:运算符 void*() const

说明: 如果至少设置了 failbit 或 badbit 之一,则为空指针。其他一些值。

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

说明: 如果设置了 failbit 或 badbit 的 none,则为真。否则为假。

这就是为什么您可以使用此表达式作为循环条件的原因 - 运算符>> returns 对 stringstream 对象的引用,然后根据支持的 C++ 版本将其转换为 void* 指针或 bool。

更多相关信息:std::ios::operator bool

2) operator>> applied for numbers 提取尽可能多的字符:

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>>

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

你的第二个问题的答案在下面的 link 中,上面写着 "Extracts and parses characters sequentially from the stream to interpret them as the representation of a value of the proper type, which is stored as the value of val." 所以在这种情况下,它将提取尽可能多的字符以将其转换为整数。

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