如何从字符串 C++ 中读取多个整数

Posted

技术标签:

【中文标题】如何从字符串 C++ 中读取多个整数【英文标题】:How To Read Multiple Integers from a String C++ 【发布时间】:2020-02-04 05:27:00 【问题描述】:

我试图了解如何从一个字符串转换多个整数。我尝试使用atoi()stoi()istringstream(),它们都做同样的事情。我只能得到一个整数。

例如,如果字符串是"Chocolate and Milk 250 pounds and 2 oz or 1.5 coins." 上述所有功能都将不起作用。它不会占用整个字符串。如果我只留下一个号码,那么它将起作用。我希望能够读取整个字符串并仅获取所有 整数(不是 float)。

我使用while(getline()) 作为字符串。然后试着把它变成字符串。

虽然,如果我只能返回字符串中的整数总数会更好。无论哪种方式,我都在努力学习这两种方式。在这种情况下,输出将是 "2",因为只有两个 int。

【问题讨论】:

【参考方案1】:

一种方法是使用分隔符分割字符串,并在单个字符串上使用stoi 来检查它们是否为整数。

#include <iostream>
#include <sstream>
#include <string>

int main()
    std::string s = "Chocolate and Milk 250 pounds and 2 oz or 1.5 coins.";
    int count = 0;
    std::istringstream iss(s);
    std::string token;
    while(getline(iss,token,' '))
        if(std::isdigit(token[0]) &&stoi(token) && token.find('.')==std::string::npos)
            count++;
        
    

    std::cout<<count<<std::endl;

请注意,如果stoi 成功,则可以对字符串进行更复杂的检查,但输入不是有效的整数。你可以有一个辅助函数,通过使用isdigit 等来检查所有字符是否都是数字。

【讨论】:

对不起,我不熟悉“try”、“catch”。这超出了我的技能。我还在学习一些基础知识,特别是循环。有没有更简单的方法来完成所有这些?也许只有一种返回字符串中整数数量的方法,而不是读取字符串并将其转换为 int(不是 float)? 您也可以简单地包含&lt;cctype&gt;并检查isdigit(token[0]),如果是,则使用stof进行转换并检查小数部分是否大于1E-5等小数,如果因此,将其保留为浮点数,如果不重新解释为整数值。 try ... catch ... 所做的只是尝试转换,如果失败,则会引发异常,该异常将被 catch 部分捕获——允许您处理错误(在这种情况下,只需跳到下一个标记)参见 @987654321 @ try/catch 很容易理解。但是,我将编辑答案以不使用它并应用类似于上述评论的内容。 还值得解释的是,token.find('.')==std::string::npos 检查token 中是否存在'.' 以丢弃1.5 的转换,并明确转换为@达到'.' 时,"1.5" 的 987654337@ 会将值转换为 1 停止转换。干得好。 感谢您的帮助。我很感激。您能否向我解释一下npos 是什么,比如它的作用。基于if()函数,有没有办法让它更简单?我之所以这么说,是因为该功能中有一些我不熟悉的东西,就像我之前说的那样。我以前从来没有使用过这么大的 if() 声明,并且有很多参数。

以上是关于如何从字符串 C++ 中读取多个整数的主要内容,如果未能解决你的问题,请参考以下文章

从字符串C++中取出整数[重复]

从文件中读取 64 位整数字符串

如何从 C++ 中的文本文件中逐行读取整数? [复制]

从文本文件中读取整数并使用 C++ 将它们存储到向量中

从字符串 C++ 中提取某些整数

从文本文件中打印字符串和整数 (C++)