无法弄清楚为什么我的str2Int函数返回0

时间:2013-12-21 21:08:23

标签: c++

以下代码的输出为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;
}

4 个答案:

答案 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;
}