当前位置: 首页 > 知识库问答 >
问题:

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

亢嘉茂
2023-03-14

我解决了一个黑客等级的问题。

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

共有1个答案

陆伟
2023-03-14

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

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

cin >> n;
for (int i = 0; i < n; ++i)
{
    cin >> value;
    vk.push_back(value);
}
cin >> x >> vm0 >> vm1;
 类似资料:
  • 问题内容: 所以我有以下程序: 它在“ one [1] =’b’”行上进行段错误,这是有道理的,因为指针“ one”指向的内存必须位于只读内存中。但是,问题是,为什么“ two [1] =’b’” segfault行没有出现?查看gcc的程序集输出: 我们看到两个字符串都在rodata部分中,因此它们是只读的。那么,为什么“ two [1] =’b’行不存在段错误”呢? 问题答案: 直接指向位于只

  • 我在实现合并排序时遇到了分段错误。我已经检查了数组是否超出边界。我想得到一些帮助,找出我哪里出了问题。我尝试过小数组的输入,例如大小为10的数组,我将temp的大小作为静态值( 更新:我只需要改变mid=(低高)/2。

  • 在用C进行编码练习时,我必须为指向结构()的指针分配内存,即使该结构可能已经预先为它分配了内存,否则我将得到“赋值到空指针”类型的错误。 我的假设是,如果指针要指向一个预先分配内存的结构,那么分配更多的内存将是冗余的?为了澄清,代码编译和运行都没有错误,只是搞不清楚为什么我需要分配内存来实现预期的行为。 这里有一个链接到一个要点,以了解完整的上下文。谢了!

  • 问题内容: 我有一个结构: 我在全球范围内存储一部分用户: 最后,http处理程序: 所以,为什么会这样,我的意思是我发送“加载”请求,它加载数据,设置为。但是在下一次调用“ newData”请求时,是? 以防万一,这里是: 编辑: 哪里来的: 问题答案: 这是因为您对 副本 进行操作,而不是对slice元素本身进行操作。 在函数中,make循环遍历的元素的副本,然后返回此副本的地址。因此,稍后您

  • 问题内容: 我是Java菜鸟。我已经掌握了将C / C ++指针转换为Java引用的概念,并且进展相当顺利。 我打了一段有指针的代码(即* ptr)。我需要取消引用指针并更改其指向的指针的值(即 ptr =&newthing;) 在Java中这似乎要困难得多。是否有人对如何解决此问题有任何想法?快速谷歌搜索什么都没有。 这是C ++中的代码示例。我想在Java中获得类似的工作,但是ptr_to_p

  • 学习 C++ 的指针既简单又有趣。通过指针,可以简化一些 C++ 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。所以,想要成为一名优秀的 C++ 程序员,学习指针是很有必要的。 正如您所知道的,每一个变量都有一个内存位置,每一个内存位置都定义了可使用连字号(&)运算符访问的地址,它表示了在内存中的一个地址。请看下面的实例,它将输出定义的变量地址:#include <iostr