3

我是 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;
}
4

2 回答 2

9

对于大多数预构建的解决方案,我会使用向量和std::transform. 这个想法是遍历每个字符并将其整数形式添加到向量中:(请参阅完整示例

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',这是我们需要的整数。

对于额外的安全层,您可以使用isdigit来检查字符是否为数字。如果不是,请引发某种错误(如异常),或者以其他方式处理它。这样可以确保ints向量中的数字是从 0 到 9,并且不会以 25 之类的数字结束。

于 2012-12-22T20:42:22.423 回答
6

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

于 2012-12-22T20:38:45.613 回答