【问题标题】:Parsing integer from comma delimited string从逗号分隔的字符串中解析整数
【发布时间】:2015-05-24 12:23:44
【问题描述】:

我是 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 &gt;&gt; i。据我了解,istream::&gt;&gt; 返回操作的 istream。错误位可能由操作设置。似乎没有涉及布尔变量。 ss &gt;&gt; i如何作为条件语句?

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

非常感谢, M

【问题讨论】:

    标签: c++ string iostream istream


    【解决方案1】:

    1) 条件语句。

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

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

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

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

    描述:如果没有设置failbit 或badbit,则为true。否则为假。

    这就是为什么您可以将此表达式用作循环的条件 - operator>> 返回对 stringstream 对象的引用,然后根据支持的 C++ 版本将其转换为 void* 指针或布尔值。

    更多信息: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>>

    【讨论】:

      【解决方案2】:

      ss &gt;&gt; i如何作为条件语句?

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

      另外,&gt;&gt; 是否提取一个或多个字符?

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

      【讨论】:

        【解决方案3】:

        stringstream 中的运算符 >> 继承自 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/

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-20
          • 2021-11-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-12-04
          • 1970-01-01
          相关资源
          最近更新 更多