我有以下几行代码:
vector<string> c;
string a;
for(int i=0;i<4;i++){
cin>>a;
c.push_back(a);
}
如果我提供输入:
$ 120,132 $ 435 $ 534 $
如何单独提取整数值并将它们相加以获得总值?
答案 0 :(得分:4)
您可以使用例如std::getline
使用逗号的“line”分隔符,从字符串中删除最后一个字符('$'
)并使用std::stoi
转换为整数:
std::vector<int> c;
for (int i = 0; i < 4; i++)
{
std::string a;
std::getline(std::cin, a, ',');
a = a.substr(a.length() - 1); // Remove trailing dollar sign
c.push_back(std::stoi(a));
}
修改:使用std::accumulate
:
int sum = std::accumulate(c.begin(), c.end(), 0);
修改2 :使用std::strtol
代替std::stoi
:
函数std::stoi
是最新C ++标准(C ++ 11)中的新功能,但尚未在所有标准库中支持。然后,您可以使用旧的C函数strtol
:
c.push_back(int(std::strtol(a.c_str(), 0, 10)));
答案 1 :(得分:2)
您可以使用正则表达式和流:
#include <regex>
#include <iostream>
#include <sstream>
const std::string Input("120$,132$,435$,534$");
int main(int argc, char **argv)
{
const std::regex r("[0-9]+");
int Result = 0;
for (std::sregex_iterator N(Input.begin(), Input.end(), r); N != std::sregex_iterator(); ++N)
{
std::stringstream SS(*N->begin());
int Current = 0;
SS >> Current;
Result += Current;
std::cout << Current << '\n';
}
std::cout << "Sum = " << Result;
return 0;
}
输出:
120
132
435
534
Sum = 1221
如果您必须确保该号码后跟'$'
,请将正则表达式更改为:"[0-9]+\\$"
stringstream
部分将忽略数字转换中的结尾'$'
:
#include <regex>
#include <iostream>
#include <sstream>
const std::string Input("120$,132$,435$,534$,1,2,3");
int main(int argc, char **argv)
{
const std::regex r("[0-9]+\\$");
int Result = 0;
for (std::sregex_iterator N(Input.begin(), Input.end(), r); N != std::sregex_iterator(); ++N)
{
std::stringstream SS(*N->begin());
int Current = 0;
SS >> Current;
Result += Current;
std::cout << Current << '\n';
}
std::cout << "Sum = " << Result;
return 0;
}
输出:
120
132
435
534
Sum = 1221
答案 2 :(得分:1)
如果输入不是太大(特别是如果它是一个单一的话
line),最简单的解决方案是将它全部打包成一个字符串,然后解析
那样,创建一个std::istringstream
来转换每个数字
字段(或使用boost::lexical_cast<>
,如果它有一些奇怪的机会
适当的语义 - 它通常在翻译时发生
字符串到内置数字类型)。对于这个简单的事情,它是
但是,可以直接从流中读取:
std::istream&
ignoreDollar( std::istream& stream )
{
if ( stream.peek() == '$' ) {
stream.get();
}
return stream;
}
std::istream&
checkSeparator( std::istream& stream )
{
if ( stream.peek() == ',' ) {
stream.get();
} else {
stream.setstate( std::ios_base::failbit );
}
return stream;
}
std::vector<int> values;
int value;
while ( std::cin >> value ) {
values.push_back( value );
std::cin >> ignoreDollar >> checkSeparator;
}
int sum = std::accumulate( values.begin(), values.end(), 0 );
(在这种特殊情况下,做一切可能更简单
在while
循环中。操纵器是一种通常有用的技术,
但是,可以在更广泛的背景下使用。)
答案 3 :(得分:1)
简单版本:
int getIntValue(const std::string& data)
{
stringstream ss(data);
int i=0;
ss >> i;
return i;
}
int getSum(std::vector<std::string>& c)
{
int sum = 0;
for (auto m = c.begin(); m!= c.end(); ++m)
{
sum += getIntValue(*m);
}
return sum;
}
完成