将字符串转换为整数数组?

时间:2012-12-22 20:35:07

标签: c++

我是C ++的初学者,无法解决这个问题。就像问题所说,如果我有一个字符串(一个数字),我怎样才能将每个数字转换为一个整数并将每个数字放入一个整数数组?

这是我的尝试:

std::string stringNumber = "123456789"; // this number will be very large

int intNumber[stringNumber.length()];

for (int i = 0; i < stringNumber.length(); i++) 
{
    intNumber[i] = std::atoi(stringNumber[i]);
    std::cout << intNumber[i] << std::endl;
}

2 个答案:

答案 0 :(得分:8)

对于大多数预先构建的解决方案,我会使用向量和std::transform。我们的想法是遍历每个字符并将其整数形式添加到向量中:(see full sample

std::string s = "1357924680";
std::vector<int> ints;
ints.reserve(s.size()); //to save on memory reallocations, thanks Nawaz
std::transform(std::begin(s), std::end(s), std::back_inserter(ints),
    [](char c) {
        return c - '0';
    }
);

这样做是从字符串的开头到结尾循环,取每个字符,并将其值减去'0''5' - '0'将为5)到结尾向量,让你与整数等价的向量。最重要的是,它没有重新发明轮子!

它还解决了你遇到的两个问题:

  1. 它使用std::vector而不是可变长度数组(VLA)。后者是非标准的,因此如果需要运行时大小的数组,则更喜欢向量。

  2. 你使用atoi,这本身就很糟糕,因为它在错误时返回0,不确定结果是否为0或是否有错误。它也需要一个字符串,而不是一个字符。相反,它会找到'0'和字符之间的距离,这是我们需要的整数。

  3. 要获得额外的安全保护,您可以使用isdigit检查该字符是否为数字。如果没有,引发某种错误(如异常),或处理它,否则你会。这样可以确保ints向量中的数字从0到9,并且您最终不会得到数字,例如25。

答案 1 :(得分:6)

你不需要atoi()。使用intNumber[i] = stringNumber[i] - '0';