我有一个字符串包含数字但它们之间还包含空格,我需要将字符串转换为int并将它们存储在int数组中。
以下函数会产生运行时错误
void fun(string m)
{
string temp;
int j = 0;
int h = 0;
int d;
int arr[10];
for (int i = 0; i < m.length(); i++)
{
while (m[i] != ' ')
temp[j++] = m[i];
d = atoi(temp.c_str());
arr[h++] = d;
}
for (int i = 0; i < sizeof(arr); i++)
{
cout << arr[i];
}
}
答案 0 :(得分:1)
我建议使用stringstream
,而不是滚动自己的实现。
#include <sstream>
#include <iterator>
#include <iostream>
int main()
{
std::stringstream ss("1 2 3 4 5 6 7");
auto head = std::istream_iterator<int>(ss);
auto tail = std::istream_iterator<int>();
while(head!=tail)
{
std::cout << *head << "\n";
++head;
}
return 0;
}
如果您在方法中收到string
,则可以轻松调整上述函数以创建空stringstream
,然后将其传递给字符串。
#include <sstream>
#include <iterator>
#include <iostream>
int main()
{
std::string astring = "1 2 3 4 5 6";
std::stringstream ss;
ss << astring;
auto head = std::istream_iterator<int>(ss);
auto tail = std::istream_iterator<int>();
while(head!=tail)
{
std::cout << *head << "\n";
++head;
}
return 0;
}
答案 1 :(得分:0)
您不能for (int i = 0; i < sizeof(arr); i++)
sizeof()
运算符为您提供以字节为单位的大小,对于10 int
的数组,可能达到40个。您需要使用以下内容:
#define COUNTOF(x) ((x)/sizeof((x)[0]))
for (int i = 0; i < COUNTOF(arr); i++)
答案 2 :(得分:0)
问题出在你的while循环中,J是第一次迭代通过While循环的0,并在第一次调用时递增,同时还试图将它分配给下一个字母。
尽管存在这个问题,我建议像其他人所说的那样使用字符串流来解决这个问题。 Here's a good reference.
答案 3 :(得分:0)
您在代码中犯了几个错误。
您尚未初始化temp
以包含任何内容,但您正在尝试索引其字符。您需要使用temp[j++] = m[i]
或temp += m[i];
或temp.push_back(m[i]);
,而不是temp.append(&m[i], 1);
。或者考虑使用std::ostringstream
收集字符,然后调用其str()
方法来提取最终的std::string
值。
您没有在i
循环中递增while
。一旦for
循环到达非空白字符,您的while
循环将无休止地连续运行(并且不成功)尝试将相同的字符追加到temp
。
您没有进行任何检查,以确保您的for
循环不超过arr
最多10个数字的容量。
您滥用sizeof()
。 sizeof(arr)
返回arr
在内存中占用的字节数(10 * sizeof(int)
,即20或40字节,具体取决于编译器的int
实现)。它不是数组(10)中的元素数量。所以你将超过试图显示20/40数字而不是10个数字的数组范围。
您的代码比它需要的更复杂。您可以使用std::istringstream
进行解析,并让它为您忽略空格。使用std::vector
或其他动态大小的容器来接收已解析的数字。
#include <sstream>
#include <vector>
void fun(string m)
{
std::istreamstream iss(m);
std::vector<int> vec;
int num;
vec.reserve(10); // optional
while (iss >> num) {
vec.push_back(num);
}
for (int i = 0; i < vec.size(); ++i) {
std::cout << vec[i];
}
/*
alternatively:
for (std::vector<int>::iterator iter = vec.begin(); iter != vec.end(); ++iter) {
std::cout << *iter;
}
*/
/*
alternatively (C++11 and later):
for (auto i: vec) {
std::cout << i;
}
*/
/*
alternatively (C++11 and later):
std::for_each(vec.begin(), vec.end(), [](int &n){ std::cout << n; });
*/
}