![](/img/trans.png)
[英]why does using '<=' instead of '<' in the loop condition gives a segmentation fault [SIGSEGV]?
[英]Why does the code below causes Segmentation Fault (SIGSEGV)?
问题陈述 给定一个严格递增的整数序列 A1,A2,…,AN。 你的任务是压缩这个序列。
此序列的压缩形式是由逗号(字符“,”)分隔的范围序列。 范围是一个整数或一对由三个点分隔的整数(字符串“...”)。 当压缩形式的每个范围 a...b 被解压缩为子序列 (a,a+1,...,b) 时,我们应该再次获得(逗号分隔的)序列 A。
对于 A 的每个最大连续子序列 (a,a+1,...,b) 使得 b≥a+2,A 的压缩形式必须包含范围 a...b; 如果 b≤a+1,这样的序列不应该被压缩到一个范围内。 如果一个连续的子序列不能被 A 的至少一个元素扩展到它旁边,那么它就是最大的。 可以证明,任何序列的压缩形式都是唯一的(即明确定义的)。
输入 输入的第一行包含一个整数 T,表示测试用例的数量。 T 测试用例的描述如下。 每个测试用例的第一行包含一个整数 N。第二行包含 N 个空格分隔的整数 A1,A2,...,AN。 输出 对于每个测试用例,打印一行包含一个字符串——给定序列的压缩形式。
约束
1≤T≤100
1≤N≤100
1 ≤ Ai ≤ 1000 for each valid i
A1 < A2 < …... <AN
子任务
子任务 #1(100 分):原始约束
示例输入
3
12
1 2 3 5 6 8 9 10 11 12 15 17
4
4 5 7 8
1
4
示例输出
1...3,5,6,8...12,15,17
4,5,7,8
4
我的代码:
#include <bits/stdc++.h>
using namespace std;
bool b[1005];
int a[1005];
int main()
{
int test, i, j, size, count;
cin >> test;
while (test--)
{
for (i = 0; i < 1005; i++)
b[i] = false;
cin >> size;
for (i = 0; i < size; i++)
{
cin >> a[i];
b[a[i]] = true;
}
for (i = 0; i < 1005; i++)
{
if (b[i] == true)
{
cout << i;
j = i;
count = 0;
while (b[j] == true)
{
count++;
j++;
}
if (count > 2)
{
i = j;
if ((j - 1) != a[size - 1])
cout << "..." << i - 1 << ",";
else
cout << "..." << i - 1;
}
if (count == 2)
{
i = j;
if ((j - 1) != a[size - 1])
cout << "," << i - 1 << ",";
else
cout << "," << i - 1;
}
if (count == 1 && ((j - 1) != a[size - 1]))
cout << ",";
}
}
}
return 0;
}
}
我的问题:上面的代码在我的设备上完美运行并提供所需的输出。 但是当我将此解决方案提交给 Online Judge 时,它说分段错误。 可以肯定的是,从根本上说,我是在错误地访问内存。 你能告诉我它在哪里吗?
b 被定义为 bool[1005]
在这部分
for(i=0 ; i<4000 ; i++)
b[i] = false;
您正在写入错误值 4000 次,超出数组大小。 编译器允许覆盖数组,但在运行时会出现未定义的行为。 简而言之:它可以或不能导致段错误。
鉴于输入数据位于文件input.txt
,这是另一种方法:
#include <fstream>
#include <iostream>
#include <string>
#include <vector>
class Reader {
public:
Reader(const std::string& filename) :
filename_(std::move(filename)), is_(filename_)
{
is_.exceptions( std::ifstream::failbit | std::ifstream::badbit );
}
int get_N() {
int N;
is_ >> N;
return N;
}
std::vector<int> get_ints(int N) {
std::vector<int> v;
v.reserve(N);
for (int i = 0; i < N; i++ ) {
int value;
is_ >> value;
v.push_back(value);
}
return v;
}
int get_num_cases() {
int num_cases;
is_ >> num_cases;
return num_cases;
}
private:
std::string filename_;
std::ifstream is_;
};
bool start_range_cur( std::vector<int> &v, int j, int N )
{
if ( j>= (N - 2) ) return false;
return ((v[j+1] - v[j]) == 1) && ((v[j+2] - v[j+1]) == 1);
}
bool in_range_cur( std::vector<int> &v, int j )
{
return (v[j+1] - v[j]) == 1;
}
void print_range( int min, int max, bool print_comma)
{
std::cout << min << ".." << max;
if (print_comma) std::cout << ",";
}
void print_single(int val, bool print_comma)
{
std::cout << val;
if (print_comma) {
std::cout << ",";
}
}
int main() {
Reader is {"input.txt"};
int num_cases = is.get_num_cases();
for (int i = 0; i < num_cases; i++) {
int N = is.get_N();
std::vector<int> v = is.get_ints(N);
bool in_range = false;
int range_start;
for( int j = 0; j< N; j++ ) {
if (in_range) {
if (j == (N - 1)) {
print_range(range_start, v[j], false);
}
else if (in_range_cur(v, j)) {
continue;
}
else {
print_range(range_start, v[j], true);
in_range = false;
}
}
else {
if (j == (N - 1)) {
print_single(v[j], false);
}
else if (start_range_cur(v, j, N)) {
in_range = true;
range_start = v[j];
}
else {
print_single(v[j], true);
}
}
}
std::cout << '\n';
}
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.