函数从string转换为int的运行时错误

时间:2015-12-10 00:44:14

标签: c++ string

我有一个字符串包含数字但它们之间还包含空格,我需要将字符串转换为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];
        }
}

4 个答案:

答案 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)

您在代码中犯了几个错误。

  1. 您尚未初始化temp以包含任何内容,但您正在尝试索引其字符。您需要使用temp[j++] = m[i]temp += m[i];temp.push_back(m[i]);,而不是temp.append(&m[i], 1);。或者考虑使用std::ostringstream收集字符,然后调用其str()方法来提取最终的std::string值。

  2. 您没有在i循环中递增while。一旦for循环到达非空白字符,您的while循环将无休止地连续运行(并且不成功)尝试将相同的字符追加到temp

  3. 您没有进行任何检查,以确保您的for循环不超过arr最多10个数字的容量。

  4. 您滥用sizeof()sizeof(arr)返回arr在内存中占用的字节数(10 * sizeof(int),即20或40字节,具体取决于编译器的int实现)。它不是数组(10)中的元素数量。所以你将超过试图显示20/40数字而不是10个数字的数组范围。

  5. 您的代码比它需要的更复杂。您可以使用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; });
        */
    }