Не могу понять, почему моя функция str2Int возвращает 0

0

Результат следующего кода равен 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
    Эти глобальные map чрезвычайно уродливы и излишни, и (int)pow(10.0, k); является худшим из возможных способов вычисления 10 в целочисленной степени. И #include <math.h> устарело, вы ищете #include <cmath> .
  • 0
    Теперь это исправлено. Попросите пересмотреть код. codereview.stackexchange.com
Теги:

4 ответа

4

Удалить эту строку

int sum(0);

Из блока else вы создаете новую переменную sum, которая привязана к блоку else, который "скрывает" переменную суммы из внешней области. Вы возвращаете переменную суммы из внешней области.

  • 0
    Любое объяснение, почему?
  • 0
    Помимо возможных улучшений (в коде ОП) - правильный ответ!
Показать ещё 1 комментарий
3

Или у вас есть лучший способ написать мою функцию str2Int?

Если вы используете С++ 11:

#include <string>

int str2Int(const std::string& str)
{
    return std::stoi(str);
}
3

Кредит принадлежит Крису Тейлору, но я просто хочу объяснить, почему 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() обеспечивающий точный результат (которого он не делает). Как правило, при работе с целыми числами вы никогда не должны использовать функции, которые работают с числами с плавающей запятой.
  • 0
    Разве вы не должны делать i += *it++ - '0'; прежде чем i *= 10; ?
  • 0
    @ Smac89 Точно, не должен.
Показать ещё 2 комментария
1

Или у вас есть лучший способ написать мою функцию str2Int?

int str2Int(std::string const& str) {
  istringstream is(str);
  int ret;
  is >> ret;
  return ret;
}
  • 0
    В этом отношении просто std :: stoi
  • 0
    @SoapBox: + бесконечность.
Показать ещё 12 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню