没有指针的c++分段错误(HackerRank)

C++ Segmentation Fault with no pointers (HackerRank)

本文关键字:错误 HackerRank 分段 c++ 指针      更新时间:2023-10-16

我解决了黑客排名中的一个问题。

输入格式。输入的第一行包含一个整数N,下一行包含N个以空格分隔的整数。第三行包含一个整数x,表示应该从vector中移除的元素的位置。第四行包含两个整数a和b,表示应该从包含a但不包含b的向量中擦除的范围。

输出格式。打印第一行vector对象的大小,以及第二行两次擦除操作后vector对象的元素(以空格分隔)。

代码:

#include <vector>
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main() {
    int n = 0, x = 0, value = 0;
    vector<int> vk, vm;
    vk.reserve(100000);
    string k, m;
    
    cin >> n;
    cin.ignore();
    getline(cin, k);
    cin >> x;
    cin.ignore();
    getline(cin, m);
    stringstream sk(k);
    while (sk >> value)
        vk.push_back(value);
    stringstream sm(m);
    while (sm >> value)
        vm.push_back(value);
    vk.erase(vk.begin() + x-1);
    vk.erase(vk.begin() + vm[0]-1, vk.begin() + vm[1]-1);
    cout << vk.size() << endl;
    for (int i = 0; i < vk.size(); i++)
        cout << vk[i] << " ";
    cout << endl;
    return 0;
}

但是这个测试用例产生了一个"分割错误":

6
1 4 6 2 8 9
2
2 4

你能帮我检查我的代码并提供一些问题的反馈吗?

编辑

感谢@john的回答。下面是没有segfault的情况:

#include <vector>
#include <iostream>
#include <string>
using namespace std;
int main() {
    int n = 0, x = 0, y = 0, z = 0, value = 0;
    vector<int> vk;
    vk.reserve(100000);
    
    cin >> n;
    for (int i = 0; i < n; ++i) {
        cin >> value;
        vk.push_back(value);
    }
    cin >> x >> y >> z;
    
    vk.erase(vk.begin() + x-1);
    vk.erase(vk.begin() + y-1, vk.begin() + z-1);
    cout << vk.size() << endl;
    for (int i = 0; i < vk.size(); i++)
        cout << vk[i] << " ";
    cout << endl;
    return 0;
}

您的输入代码太辛苦了。这是不正确的,因为你似乎假设cin.ignore()将跳过其余的行,当它只跳过下一个字符(这可能是一个空格)。我想这就是隔离故障的原因。读完第一个数字后,你就能知道你要读多少个数字了。根本不需要使用getlinestringsteam

你不需要vm向量。它将始终包含两个值,因此只需声明两个变量。您还可以为所有变量选择更好的名称。

cin >> n;
for (int i = 0; i < n; ++i)
{
    cin >> value;
    vk.push_back(value);
}
cin >> x >> vm0 >> vm1;