没有指针的 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()
将跳过该行的其余部分,而它只跳过下一个字符(可能是一个空格)。我猜这是段错误的原因。读完第一个数字后,您可以知道要读多少个数字。根本不需要使用getline
或stringsteam
。
您不需要 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)的主要内容,如果未能解决你的问题,请参考以下文章