以下代码的输出为0.我无法弄清楚原因。 (我知道我已经在这个代码块中询问了一个关于编译器错误的问题。现在它正在运行但是没有正常工作。)
有人有想法吗?或者有更好的方法来编写我的str2Int函数?它应该采用像“2833812”这样的字符串并将其转换为int 2833812.
#include <iostream>
#include <map>
#include <math.h>
const char digit_ints[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
std::map<char,int> digit_map;
int str2Int(const std::string& S) {
int sz(S.size()), sum(0);
if (sz == 0) {
std::cout << "str2Int() cannot take an empty string as a parameter." << std::endl;
return -1;
} else {
int sum(0);
for (int j(0), k(sz - 1); j < sz; ++j, --k) {
if ((S[j]) < '0' || (S[j]) > '9') {
std::cout << "str2Int can only take strings with chars '0' through '9' as parameters." << std::endl;
return -1;
} else {
sum += digit_map[S[j]] * (int)pow(10.0, k);
}
}
}
return sum;
}
int main() {
for (int i = 0; i < 10; ++i)
digit_map.insert(std::pair<char,int>(digit_ints[i], i));
std::cout << str2Int("3421");
return 0;
}
答案 0 :(得分:4)
删除此行
int sum(0);
在else块中,您将创建一个新的sum变量,该变量的作用域是else块,该块是从外部作用域“隐藏”sum变量。您将从外部范围返回sum变量。
答案 1 :(得分:3)
归功于Chris Taylor,但我只想解释int sum(0);
分支中else
错误的原因:您在声明另一个 sum
变量内部块,以便阴影(隐藏)您稍后返回的那个。
编写函数的更好方法是(不进行错误检查):
int str2int(const std::string &s)
{
// do error checking, then:
int i = 0;
std::string::const_iterator it = s.begin();
while (it != s.end()) {
i *= 10;
i += *it++ - '0';
}
return i;
}
为什么这比你目前的方法更好?
pow()
提供精确结果(它没有)。通常,在使用整数时,不应使用以浮点数运算的函数。答案 2 :(得分:3)
或者有更好的方法来编写我的str2Int函数?
如果您使用的是C ++ 11:
#include <string>
int str2Int(const std::string& str)
{
return std::stoi(str);
}
答案 3 :(得分:1)
或者有更好的方法来编写我的str2Int函数?
int str2Int(std::string const& str) {
istringstream is(str);
int ret;
is >> ret;
return ret;
}