2016-07-29 8 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; 
} 

を私は> 0代わりの>= 0

while条件を変更して見つけました

j0で、ループに入ると、出力されていないときに、これがあるとしてそれは、最初の文字列以外のすべてを並べ替え:

thickness 
combed 
escorted 
revocable 

私はCに新たなんだと、私はこれが集まります割り当てられていないメモリにアクセスすることに関連していますが、私はどこを見るのが苦労しています。

答えて

3

あなたのループテストは正しくありません。

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

あなたはそれを使用して前に、インデックスjを確認する必要がありますし、あなたがstrcmp()a[j]未満keyため-1を返すに頼るべきではありません。 strcmp()は、この場合負の値を返すとして指定されています。

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

今日はすべての8気筒で打っています! –

+0

@ DavidC.Rankin:もっと重要な仕事を先延ばしすることは、非常に効果的な動機です。 ';-) ' – chqrlie

+0

@yhsdygdyusgdysgdsudsd:回答スコアの下にある灰色のチェックマークをクリックしてこの回答を受け入れることができますか? – chqrlie