我是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;
}
Run Code Online (Sandbox Code Playgroud)
对于大多数预先构建的解决方案,我会使用向量和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';
}
);
Run Code Online (Sandbox Code Playgroud)
这样做是从字符串的开头到结尾循环,取每个字符,并将它的值减去'0'('5' - '0'将是5)到向量的末尾,留下一个等价整数的向量.最重要的是,它不会重新发明轮子!
它还解决了您遇到的两个问题:
它使用std::vector而不是可变长度数组(VLA).后者是非标准的,因此如果需要运行时大小的数组,则更喜欢向量.
你使用atoi,这本身就很糟糕,因为它在错误时返回0,不确定结果是否为0或是否有错误.它也需要一个字符串,而不是一个字符.相反,它找到了'0'和字符之间的距离,这是我们需要的整数.
要获得额外的安全层,您可以使用它isdigit来检查字符是否为数字.如果没有,引发某种错误(如异常),或处理它,否则你会.这可以确保ints向量中的数字从0到9,并且您不会得到一个数字,例如25.