正在分析逗号分隔字符串中的整数

Parsing integer from comma delimited string

本文关键字:字符串 整数 分隔      更新时间:2023-10-16

我是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如何作为条件语句?

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

非常感谢,M

1)条件语句。

std::stringstream派生自std::ios,后者定义了:

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

描述:如果设置了故障位或坏位中的至少一个,则为空指针。其他一些值。

  • 在C++11中:显式运算符布尔()常量

描述:如果未设置故障位或坏位,则为true。否则为false。

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

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

2) 运算符>>应用于数字提取尽可能多的字符:

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

ss >> i如何作为条件语句?

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

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

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

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

你的第二个问题的答案在下面的链接中,上面写着"从流中按顺序提取和解析字符,将它们解释为正确类型的值的表示,该值存储为val的值。"因此,在这种情况下,它将提取尽可能多的字符,将其转换为整数。

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