如何从字符串 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)? 您也可以简单地包含<cctype>
并检查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++ 中读取多个整数的主要内容,如果未能解决你的问题,请参考以下文章