【问题标题】:Seg Fault when counting shifts in insertion sort - C计算插入排序中的移位时的段错误 - C
【发布时间】:2014-09-26 16:22:31
【问题描述】:

我编写了以下代码来对从 C 中的 stdin 读取的 N 个整数进行排序,使用插入排序对它们进行排序,并计算对 SPOJ 问题进行排序所需的交换次数:http://www.spoj.com/problems/CODESPTB/

我的代码适用于给定的示例输入,并且我还测试了更大的整数集 f 更大的值,并且一切似乎都工作正常。但是,当我在 SPOJ 的在线判断上运行它时,它会在运行时出现分段错误而失败。不幸的是,SPOJ 问题的创建者并没有将审查失败作为一种选择。我不知道是什么导致了段错误。我的代码中是否有任何内容跳出你可能会导致它的原因?

我的代码:

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

【问题讨论】:

  • 作为堆栈溢出的新用户,如果您要否决我的问题,您至少可以解释一下原因吗?

标签: c count segmentation-fault insertion-sort


【解决方案1】:

你永远不会为a分配空间:

long *a;
...
    a[0]=atol(token);
    ...
        a[i] = atol(token);

不幸的是,未定义行为的一种可能性是它“似乎工作正常”。

【讨论】:

  • 感谢您的回复。我使用 scanf 而不是 fgets 完全重构了我的代码,它现在似乎可以工作了。我最好的选择是删除这篇文章还是我应该如何处理它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多