由简单的c++代码引起的段错误
Segmentation fault caused by simple c++ code
这里绝对是新手。我正在尝试解决 this 但出现分段错误。我尝试寻找解决方案,但找不到这不起作用的原因。
要重现错误,只需复制下面的代码并将其粘贴到上面 link 下的编辑器中。
#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
要修复分段错误,只需在第一个 std::cin
(主函数的第三行)之后添加 std::cin.get();
。
发生分段错误是因为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;
}
1) getline(std::cin, line);
。行包含 space 和数字。
2) 处理 space 行
3) 处理数组长度行中的第一个整数。 (您尝试在数组本身中添加数组长度)
这里是工作代码供参考。 (通过所有测试用例)
#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;
}
这里绝对是新手。我正在尝试解决 this 但出现分段错误。我尝试寻找解决方案,但找不到这不起作用的原因。
要重现错误,只需复制下面的代码并将其粘贴到上面 link 下的编辑器中。
#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
要修复分段错误,只需在第一个 std::cin
(主函数的第三行)之后添加 std::cin.get();
。
发生分段错误是因为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;
}
1) getline(std::cin, line);
。行包含 space 和数字。
2) 处理 space 行
3) 处理数组长度行中的第一个整数。 (您尝试在数组本身中添加数组长度)
这里是工作代码供参考。 (通过所有测试用例)
#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;
}