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

Posted

技术标签:

【中文标题】没有指针的 C++ 分段错误 (HackerRank)【英文标题】:C++ Segmentation Fault with no pointers (HackerRank) 【发布时间】:2015-08-11 05:01:27 【问题描述】:

我解决了 Hacker Rank 中的一个问题。

输入格式。输入的第一行包含一个整数 N。下一行包含 N 个空格分隔的整数。第三行包含一个整数 x,表示应被从向量中删除。第四行包含两个整数 a 和 b,表示应该从包含 a 和不包含 b 的向量中删除的范围。

输出格式。在第一行打印向量的大小,在第二行打印两次擦除操作后的向量元素,以空格分隔。

代码:

#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 的回答。以下是没有 seg 错误时的样子:

#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;

【问题讨论】:

对不起,我没看到,这是建议的,只能点击它。已删除。 它对我来说适用于同一个测试用例。 是的,在我的笔记本电脑上也适用于我,但在黑客等级网站上显示 seg 错误。一开始这很奇怪,但现在@john 提供的答案很清楚是什么错误。 【参考方案1】:

您对输入代码的尝试太过分了。这是不正确的,因为您似乎假设 cin.ignore() 将跳过该行的其余部分,而它只跳过下一个字符(可能是一个空格)。我猜这是段错误的原因。读完第一个数字后,您可以知道要读多少个数字。根本不需要使用getlinestringsteam

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

cin >> n;
for (int i = 0; i < n; ++i)

    cin >> value;
    vk.push_back(value);

cin >> x >> vm0 >> vm1;

【讨论】:

谢谢你!我正在学习 C++,这是我的第一周。现在它正在工作,你的观点和解释是对的,这就是问题所在。 ...保存为using namespace std;。请不要这样做@lohhenzo!

以上是关于没有指针的 C++ 分段错误 (HackerRank)的主要内容,如果未能解决你的问题,请参考以下文章

使用指向指针 C++ 的指针时出现分段错误

在 C++ 中使用指针的数组:访问返回的数组时出现分段错误

C++中char指针中的memset的分段错误(核心转储)[重复]

修复 C++ 中的分段错误

将指向数组的指针传递给函数时出现分段错误(C++)

c ++分段错误将指针传递给函数