2016-07-29 4 views
1

Я пытаюсь адаптировать мой номер сортировки код для вставки сортировки для сортировки файла ввода строк вместо например:Сортировка строк с сортировкой вставок в C - сбой сегментации

thickness 
combed 
revocable 
escorted 

Однако я получаю ошибку сегментации (ядра сбрасывали) при попытке запустить ниже:

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#define STRING_LEN 80 
#define ARRAY_LEN 10000 

void insertion_sort(char **a, int n) { 
    int i; 
    int j; 
    char *key; 

    for (i = 1; i < n; i++) { 
     key = a[i]; 
     j = i - 1; 

     while (strcmp(key, a[j]) == -1 && j >= 0) { 
      a[j + 1] = a[j]; 
      j = j - 1; 
     } 
     a[j + 1] = key; 
    } 
} 

void *emalloc(size_t s) { 
    void *result = malloc(s); 
    if (NULL == result) { 
     fprintf(stderr, "Memory allocation failed!\n"); 
     exit(EXIT_FAILURE); 
    } 
    return result; 
} 

int main(void) { 
    int j; 
    int num_words = 0; 
    char word[STRING_LEN]; 
    char *wordlist[ARRAY_LEN]; 

    while (num_words < ARRAY_LEN && 1 == scanf("%79s", word)) { 
     wordlist[num_words] = emalloc((strlen(word) + 1) * sizeof wordlist[0][0]); 
     strcpy(wordlist[num_words], word); 
     num_words++;  
    } 

    insertion_sort(wordlist, num_words); 

    for (j = 0; j < num_words; j++) { 
     printf("%s\n", wordlist[j]); 
    } 

    return EXIT_SUCCESS; 
} 

Я обнаружил, изменяя условия while к > 0 вместо >= 0

while (strcmp(key, a[j]) == -1 && j > 0) 

Он сортирует все, кроме первой строки, как это, когда j является 0 и цикл не вводится, а выход:

thickness 
combed 
escorted 
revocable 

Я новичок в C, и я понял, что это связанные с доступом к памяти, которая не была выделена, но я изо всех сил пытаюсь увидеть, где.

ответ

3

тест Ваш цикл неправилен:

while(strcmp(key,a[j]) == -1 && j>=0){ 

Вы должны проверить индекс jперед тем использовать его, и вы не должны полагаться на strcmp() возвращение -1 для key менее a[j]. strcmp() указывается только как возвращающее отрицательное значение для этого случая.

while (j >= 0 && strcmp(key, a[j]) < 0) { 
+0

Вы нажимаете на все 8-цилиндровые двигатели сегодня! –

+0

@ DavidC.Rankin: откладывание на какую-то более важную работу - такая невероятно эффективная мотивация ';-)' – chqrlie

+0

@yhsdygdyusgdysgdsudsd: можете ли вы принять этот ответ, нажав на серое галочку ниже ответа? – chqrlie

Смежные вопросы