C++ 如何从字符串C++;
我试图理解如何从字符串中转换多个整数。我试过使用C++ 如何从字符串C++;,c++,string,integer,atoi,istringstream,C++,String,Integer,Atoi,Istringstream,我试图理解如何从字符串中转换多个整数。我试过使用atoi(),stoi()和istringstream(),它们都做同样的事情。我只能得到一个整数 例如,如果字符串是“巧克力和牛奶250磅和2盎司或1.5硬币。” 上述所有功能均不起作用。它不会占用整根绳子。如果我只留下一个数字,那么它就会工作。我希望能够读取整个字符串并仅获取所有整数(而不是浮点) 我对字符串使用了while(getline())。然后试着把它编成字符串 尽管如此,如果我只能返回字符串中整数的总数,那就更好了。无论哪种方式,我都
atoi()
,stoi()
和istringstream()
,它们都做同样的事情。我只能得到一个整数
例如,如果字符串是“巧克力和牛奶250磅和2盎司或1.5硬币。”
上述所有功能均不起作用。它不会占用整根绳子。如果我只留下一个数字,那么它就会工作。我希望能够读取整个字符串并仅获取所有整数(而不是浮点)
我对字符串使用了while(getline())
。然后试着把它编成字符串
尽管如此,如果我只能返回字符串中整数的总数,那就更好了。无论哪种方式,我都在努力学习。在这种情况下,输出将是
“2”
,因为只有两个int。一种方法是使用分隔符拆分字符串,并对单个字符串使用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;
}
#包括
#包括
#包括
int main(){
std::string s=“巧克力和牛奶250磅和2盎司或1.5硬币。”;
整数计数=0;
标准:istringstream iss;
字符串标记;
while(getline(iss,token,')){
if(std::isdigit(令牌[0])&&stoi(令牌)&&token.find('.')==std::string::npos){
计数++;
}
}
std::cout一种方法是使用分隔符拆分字符串,并在单个字符串上使用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;
}
#包括
#包括
#包括
int main(){
std::string s=“巧克力和牛奶250磅和2盎司或1.5硬币。”;
整数计数=0;
标准:istringstream iss;
字符串标记;
while(getline(iss,token,')){
if(std::isdigit(令牌[0])&&stoi(令牌)&&token.find('.')==std::string::npos){
计数++;
}
}
std::coutSorry,但我对“try”、“catch”不太熟悉。这超出了我的技能范围。我仍在学习一些基础知识,特别是循环。有没有更简单的方法来完成这一切?也许只有一种方法可以返回字符串中的整数数量,而不是读取字符串并将其转换为int(而不是float)?您也可以简单地包括
并检查isdigit(标记[0])
,如果是,则使用stof
进行转换,并检查小数部分是否大于一些小数字,如1E-5
,如果是,则将其保留为浮点,如果不是重新解释为整数值。所有尝试{…}catch{…}
的作用是尝试转换,如果转换失败,将引发一个异常,该异常将被catch
部分捕获——允许您处理错误(在这种情况下,只需跳到下一个标记)请参阅try/catch
很容易理解。但是,我将编辑答案以不使用它,并应用类似于上述注释的内容。可能还需要解释token.find('.')==std::string::npos
检查标记中是否存在。
以放弃1.5
的转换,并明确的int
转换为“1.5”
会将值转换为1
当到达时停止转换。
做得好。谢谢你的帮助。我非常感谢。你能解释一下什么是npos
,比如它做什么。基于if()
function,有没有可能让它更简单?我这么说是因为在这个函数中有一些我以前不熟悉的东西。我以前从未使用过一个有很多参数的if()
语句。对不起,我不熟悉“try”、“catch”。这超出了我的技能范围。我仍在学习一些基础知识,特别是循环。有没有更简单的方法来完成这一切?也许只有一种方法可以返回字符串中的整数量,而不是读取字符串并将其转换为整数(而不是浮点)?您也可以简单地包括
和检查isdigit(标记[0])
如果是,则使用stof
进行转换,检查小数部分是否大于一些小数字,如1E-5
,如果是,则将其保留为浮点数,如果不是,则重新解释为整数值。所有尝试{…}catch{…}
的作用是尝试转换,如果转换失败,将引发一个异常,该异常将被catch
部分捕获——允许您处理错误(在这种情况下,只需跳到下一个标记)请参阅try/catch
很容易理解。但是,我将编辑答案以不使用它,并应用类似于上述注释的内容。可能还需要解释token.find('.')==std::string::npos
检查标记中是否存在。
以放弃1.5
的转换,并明确的int
转换为“1.5”
会将值转换为1
当到达时停止转换。
做得好。谢谢你的帮助。我非常感谢。你能解释一下什么是npos
,比如它做什么。基于if()
函数,有没有可能使它更简单?我这么说是因为在这个函数中有一些我以前不熟悉的东西。我以前从未使用过一个包含大量参数的如此大的if()
语句。