从逗号分隔的字符串中解析整数
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/
我是 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/