在插入排序中计数移位时出现Seg故障-C
我编写了以下代码来对C中从stdin读取的N个整数进行排序,使用插入排序对它们进行排序,并计算SPOJ问题排序所需的交换数: 我的代码适用于给定的示例输入,我还使用更大的整数集和更大的值进行了测试,一切似乎都很好。然而,当我在SPOJ的online judge上运行它时,它在运行时由于分段错误而失败。不幸的是,SPOJ上问题的创建者没有将审查失败作为一种选择。我不知道seg故障的原因。我的代码中有没有什么东西会跳出来告诉你是什么引起的 我的代码:在插入排序中计数移位时出现Seg故障-C,c,count,segmentation-fault,insertion-sort,C,Count,Segmentation Fault,Insertion Sort,我编写了以下代码来对C中从stdin读取的N个整数进行排序,使用插入排序对它们进行排序,并计算SPOJ问题排序所需的交换数: 我的代码适用于给定的示例输入,我还使用更大的整数集和更大的值进行了测试,一切似乎都很好。然而,当我在SPOJ的online judge上运行它时,它在运行时由于分段错误而失败。不幸的是,SPOJ上问题的创建者没有将审查失败作为一种选择。我不知道seg故障的原因。我的代码中有没有什么东西会跳出来告诉你是什么引起的 我的代码: #include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_BUFF 100
int main(int argc, char *argv[]){
char buffer[MAX_BUFF];
char *long_str;
int T, N;
long *a;
printf("Enter a T value between 1 and 5 inclusive: ");
bzero(buffer, MAX_BUFF);
fgets(buffer, MAX_BUFF - 1, stdin);
T = atoi(buffer);
if(T<1 || T>5){
printf("Error: T must be 1<=T<=5\n");
exit(0);
}
const char delim[2] = " ";
char *token;
while(T > 0){
printf("Enter a N value between 1 and 100000 inclusive: ");
bzero(buffer,MAX_BUFF);
fgets(buffer, MAX_BUFF-1, stdin);
N = atoi(buffer);
if(N<1 || N>100000){
printf("Error: N must be 1<=N<=100000\n");
exit(0);
}
int current_size = 0;
long_str = malloc(MAX_BUFF);
current_size = MAX_BUFF;
printf("Enter N integers separated by spaces: ");
if(long_str != NULL){
int c = EOF;
unsigned int i = 0;
while(( c = getchar() ) != '\n' && c != EOF){
long_str[i++]=(char)c;
if(i==current_size){
current_size = i + MAX_BUFF;
long_str = realloc(long_str, current_size);
}
}
long_str[i] = '\0';
}
token = strtok(long_str, delim);
a[0]=atol(token);
int i = 1;
while (token != NULL && i < N) {
token = strtok(NULL, delim);
if(token == NULL){
printf("Error, not enough ints specified, terminating\n");
exit(0);
}
a[i] = atol(token);
i++;
}
free(long_str);
int j, tmp, count;
count = 0;
for(i=1; i<N; i++){
j=i;
while(j>0 && a[j]<a[j-1]){
tmp = a[j];
a[j] = a[j-1];
a[j-1] = tmp;
j--;
count++;
}
}
T--;
}
}
#包括
#包括
#包括
#定义最大BUFF 100
int main(int argc,char*argv[]){
字符缓冲区[MAX_BUFF];
字符*长;
int T,N;
长*a;
printf(“输入一个介于1和5之间的T值:”);
bzero(缓冲区,最大缓冲区);
fgets(缓冲区,最大缓冲区-1,标准输入);
T=atoi(缓冲区);
如果(T5){
printf(“错误:T必须是1您从未为a
分配空间:
long *a;
...
a[0]=atol(token);
...
a[i] = atol(token);
不幸的是,未定义行为的一种可能性是它“似乎工作正常”“作为stack overflow的新用户,如果你要否决我的问题,你至少能解释一下原因吗?谢谢你的回答。我用scanf而不是fgets完全重构了我的代码,现在似乎可以正常工作了。我最好删除这篇文章,或者我该怎么处理它?