c++ 为什么在这个可变大小的数组代码中出现分段错误?

bq3bfh9z  于 2023-05-19  发布在  其他
关注(0)|答案(2)|浏览(97)

我试图解决this variable-sized array problem,但得到一个分段错误。我试着寻找一个解决方案,但找不到为什么这不起作用的原因。
要重现错误,只需复制下面的代码并将其粘贴到上面链接下的编辑器中。

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <sstream>
#include <algorithm>
//using namespace std;

int main() {
    int n, q;
    std::cin >> n >> q;

    std::vector<std::vector<int>> arr;

    // handle n lines representing the arrays
    for (int i = 0; i < n; i++) {
        std::vector<int> numbers;
        std::string line;
        getline(std::cin, line);
        std::istringstream iss(line);
        int enterNumber;
        while (iss >> enterNumber)
        {
            numbers.push_back(enterNumber);
        }

        arr.push_back(numbers);
    }

    // handle q lines representing i, j
    int x, y;
    for (int i = 0; i < q; i++) {
        std::cin >> x >> y;
        std::cout << arr[x][y];
    }

    return 0;
}

我错过了什么?为什么不管用?
导致分段错误的输入:

2 2
3 1 5 4
5 1 2 8 9 3
0 1
1 3

预期输出:

5
9
kcugc4gi

kcugc4gi1#

1)getline(std::cin, line); .行包含空格和数字。
2)处理行中的空格
3)处理数组长度行中的第一个int。(您尝试在数组本身中添加数组长度)
下面是可供参考的工作代码。(通过所有测试用例)

#include <vector>
#include <iostream>
using namespace std;
int main() {
    int n, q;
    cin >> n >> q;
    vector< vector<int> > arr;

    int temp, array_count;
    for(int i = 0; i < n; i++) {
        vector<int> numbers;
        cin>>array_count;
        for(int j = 0; j < array_count; j++) {
            cin>>temp;
            numbers.push_back(temp);
        }
        arr.push_back(numbers);
        numbers.clear();
    }

    // handle q lines representing i, j
    int x, y;
    for (int i = 0; i < q; i++) {
        cin >> x >> y;
        cout << arr[x][y]<<"\n";
    }

    return 0;
}
cedebl8k

cedebl8k2#

要修复分段错误,只需在第一个std::cin之后添加std::cin.get();(main函数中的第三行)。
发生分段错误是因为getline(std::cin, line);在for循环的第一次迭代中返回了一个空字符串。参见this
请注意,即使修复了分段错误问题,您的代码仍然是错误的(没有解决挑战):p
试试这个:

#include <cmath>
#include <cstdio>
#include <vector>
#include <iostream>
#include <sstream>
#include <algorithm>
//using namespace std;

int main() {
    int n, q;
    std::cin >> n >> q;
    std::cin.get();

    std::vector<std::vector<int>> arr;

    // handle n lines representing the arrays
    for (int i = 0; i < n; i++) {
        std::vector<int> numbers;
        std::string line;
        getline(std::cin, line);
        std::istringstream iss(line);
        int enterNumber;
        while (iss >> enterNumber)
        {
            numbers.push_back(enterNumber);
        }

        numbers.erase(numbers.begin());  // because first value is k
        arr.push_back(numbers);
    }

    // handle q lines representing i, j
    int x, y;
    for (int i = 0; i < q; i++) {
        std::cin >> x >> y;
        std::cout << arr[x][y] << std::endl;
    }

    return 0;
}

相关问题