Результат следующего кода равен 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;
}
Удалить эту строку
int sum(0);
Из блока else вы создаете новую переменную sum, которая привязана к блоку else, который "скрывает" переменную суммы из внешней области. Вы возвращаете переменную суммы из внешней области.
Или у вас есть лучший способ написать мою функцию str2Int?
Если вы используете С++ 11:
#include <string>
int str2Int(const std::string& str)
{
return std::stoi(str);
}
Кредит принадлежит Крису Тейлору, но я просто хочу объяснить, почему 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()
обеспечивающий точный результат (которого он не делает). Как правило, при работе с целыми числами вы никогда не должны использовать функции, которые работают с числами с плавающей запятой.i += *it++ - '0';
прежде чем i *= 10;
?
Или у вас есть лучший способ написать мою функцию str2Int?
int str2Int(std::string const& str) {
istringstream is(str);
int ret;
is >> ret;
return ret;
}
map
чрезвычайно уродливы и излишни, и(int)pow(10.0, k);
является худшим из возможных способов вычисления 10 в целочисленной степени. И#include <math.h>
устарело, вы ищете#include <cmath>
.