C ++将字符串转换为int函数

时间:2016-03-11 07:53:09

标签: c++

我通常在python中编程,它内置了一个字符串到整数转换器但是当我使用C ++它似乎没有工作所以我决定自己创建。 这就是我到目前为止所做的 C ++:

int strtoint(string str)
{
    int values [str.length()];
    int return_value = 0;

    for (int i=0; i < str.length(); ++i)
        if(str.at(str.length()-1-i) == '1')
            values[i] = 1;
        else if(str.at(str.length()-1-i) == '2')
            values[i] = 2;
        else if(str.at(str.length()-1-i) == '3')
            values[i] = 3;
        else if(str.at(str.length()-1-i) == '4')
            values[i] = 4;
        else if(str.at(str.length()-1-i) == '5')
            values[i] = 5;
        else if(str.at(str.length()-1-i) == '6')
            values[i] = 6;
        else if(str.at(str.length()-1-i) == '7')
            values[i] = 7;
        else if(str.at(str.length()-1-i) == '8')
            values[i] = 8;
        else if(str.at(str.length()-1-i) == '9')
            values[i] = 9;
    for (int i=0; i < str.length(); ++i)
        return_value += values[i]^(10*i);
    return return_value;
}

我似乎得到了非常奇怪的答案,例如"12"返回13"23"返回11。 我知道stoi但我更喜欢自己做,所以我可以学习C ++。

3 个答案:

答案 0 :(得分:6)

我可以快速查看三个问题。

首先是

int values [str.length()];

无效的C ++。它使用的是1999 C标准的一个特性,一些C ++编译器支持它作为扩展,但它仍然不是有效的C ++。

第二个是输入中缺少0 s或错误(非数字字符)的处理。

第三是声明

return_value += values[i]^(10*i);

^是C ++中的按位XOR运算符。不是数学取幂。

其他一些小技巧。

使用迭代器可以大大简化代码。

此外,对于所有标准字符集,罗马数字是连续的,从'0'开始。因此,将数字转换为所需数字值的简单方法是digit - '0',它会将'0'转换为0'1'转换为1,... .. '9'9

答案 1 :(得分:4)

在C ++中,我使用std::stringstreamstd::string转换为int。简单示例I found

#include <sstream>
#include <iostream>  //used for cout
int main()
{
    std::string str = "12345";
    std::istringstream ss(str);
    int i;
    ss >> i;
    if (ss.fail())
    {
        // Error
    }
    else
    {
        std::cout << "The integer value is: " << i;
    }
    return 0;
}

您可以在@Peter回答中找到代码中的错误。

答案 2 :(得分:0)

您可以使用char转换简化这一点,您只需减去'0'的值并使用迭代器,尤其是反向迭代器,这样可以更简单地计算值。

#include <cmath>
#include <string>

/*! Converts a char to an integer.
 * @param c the character to convert
 * @return the integer value [0-9] or -1 if not convertible
 */
int chartoint(const char c)
{
    auto value = (c - '0');
    if (value < 0 || value > 9)
    {
        value = -1;
    }
    return value;
}

/*! Converts a string to an integer.
 * @param string the string to convert
 * @return the converted integer value or 0 if not convertible
 */
int strtoint(const std::string& string)
{
    auto integer = 0;
    const auto begin = string.rbegin();
    for (auto it = begin, end = string.rend(); it != end; ++it)
    {
        const auto current = chartoint(*it);
        if (current == -1)
        {
            integer = 0;
            break;
        }
        else
        {
            const auto factor = static_cast<int>(std::pow(10, (it - begin)));
            integer += factor * current;
        }
    }
    return integer;
}

试运行:

#include <cassert>

int _tmain(int argc, _TCHAR* argv[])
{
    assert(strtoint("1") == 1);
    assert(strtoint("1x") == 0);
    assert(strtoint("12") == 12);
    assert(strtoint("10") == 10);

    return 0;
}