我是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?
非常感谢, 中号
答案 0 :(得分:2)
ss >> i
如何作为条件陈述?
类std::basic_ios
(所有标准流的基类)都有explicit operator bool()
,返回!fail()
。它的目的是指示流处于有效状态并可以进一步使用。
此外,
>>
是否会提取一个或多个字符?
取决于您阅读的对象的类型。对于数字,它基本上可以提取尽可能多的字符。您可以详细阅读规则here。
答案 1 :(得分:2)
1)条件声明。
std :: stringstream派生自std :: ios,它定义:
描述:如果设置了failbit或badbit中的至少一个,则为空指针。否则还有其他一些价值。
说明:如果未设置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/