2016-11-22 6 views
0

Мне нужно написать алгоритм сортировки подсчета, который сортирует строки по первой букве (неважно, является ли это капиталом или малым), но есть ошибка сегментации (сбрасывание ядра) после записи всех строк. Существуют также некоторые предупреждения (ниже)подсчет сортировки со строками [core dumped]

aaa.c: In function ‘Count’: 
aaa.c:20:23: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 
      C[i]=(char)((int)C[i]+(int)C[i-1]); 
        ^
aaa.c:20:33: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 
      C[i]=(char)((int)C[i]+(int)C[i-1]); 
           ^
aaa.c:20:15: warning: assignment makes pointer from integer without a cast [-Wint-conversion] 
      C[i]=(char)((int)C[i]+(int)C[i-1]); 
      ^
aaa.c:22:25: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 
       B[(int)C[(int)A[j]]]=A[j]; 
         ^
aaa.c:22:18: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 
       B[(int)C[(int)A[j]]]=A[j]; 
       ^
aaa.c:23:18: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 
       C[(int)A[j]]=C[(int)A[j]]-1; 
       ^
aaa.c:23:31: warning: cast from pointer to integer of different size [-Wpointer-to-int-cast] 
       C[(int)A[j]]=C[(int)A[j]]-1; 


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

#define MaxStringLength 30 
#define MaxStringNumber 5 
#define NumberOfLetters 26 

char **A; 
char **B; 
char **C; 

void Count(char **A, char **B, int quantity){ 
     int i,j; 

     for (i=1;i<=NumberOfLetters;i++) C[i]=0; 
     for (j=1;j<=quantity;j++) 
      C[A[j][1]-96] +=1; 
     for (i=2;i<=NumberOfLetters;i++) 
      C[i]=(char)((int)C[i]+(int)C[i-1]);  
     for (j=MaxStringNumber;j>0;j--){ 
       B[(int)C[(int)A[j]]]=A[j]; 
       C[(int)A[j]]=C[(int)A[j]]-1; 

     } 
} 

void printing(char **array, int quantity){ 
     int i; 
     for (i=1;i<=quantity;i++) 
       printf("%s \n", array[i]); 
} 

void reading(char **array, int quantity){ 
     char word[MaxStringLength]; 
     int i; 
     for (i=1;i<=quantity; i++){ 
       scanf("%s",word); 
       array[i] = (char*) malloc(sizeof(char)*MaxStringLength); 
       strcpy(array[i],word); 
     } 
} 

int main(){ 
     A=(char**) malloc((MaxStringNumber+1)*sizeof(char*)); 
     B=(char**) malloc((MaxStringNumber+1)*sizeof(char*)); 
     C=(char**) malloc((MaxStringNumber+1)*sizeof(char*)); 

     printf("Array A:\n"); 
     reading(A,MaxStringNumber); 
     Count(A,B,MaxStringNumber); 
     printf("Sorted:\n"); 
     printing(B,MaxStringNumber); 

     return 0; 
} 
+2

Исправить предупреждения. В такой маленькой программе никогда не должно быть никаких предупреждений. 'С [(INT) A [J]]'. Чего вы ожидаете достичь с помощью указателя как индекса массива? – kaylum

+2

Программа даже не имеет смысла. Я бы рекомендовал начать с абсолютных основ C. @kaylum. Меня больше беспокоит использование символа 'char' в качестве указателя. – EOF

+2

Способ, которым вы написали этот код - используя глобальные переменные для A, B и C; имеющие магические числа, такие как 96 и короткие имена, такие как A, B и C; и используя 1-индексирование в массиве - все это, вероятно, повлияет на то, почему вы столкнулись с проблемами здесь. Я думаю, что вы можете захотеть перестроить этот код, чтобы избежать глобальных переменных и использовать более выразительные имена, чтобы сделать вещи более ясными. – templatetypedef

ответ

0

Как отмечалось, было несколько проблем с исходным кодом. В индексах C идут от 0 до размера-1, а не от 1 до размера. C [] должен быть массивом целых чисел (или size_t). Исходные и конечные значения для циклов и проверки конца цикла, такие как < или < =, должны быть исправлены.

Поскольку количество исправлений одной и той же ошибки в момент времени занимает слишком много времени, я создал рабочий пример.

Этот пример работает, но предполагает, что вводится ровно 5 строк, а все символы - в нижнем регистре. -96 преобразует 'a' в 1, 'b' в 2, .... Таким образом, после генерации счетчиков C [0] = 0, C [1] = счетчик 'a', C [2] = счетчик 'b', ...

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

#define MaxStringLength 30 
#define MaxStringNumber 5 
#define NumberOfLetters 26 

void Count(char **A, char **B, int *C, int quantity){ 
int i,j; 
    for (i=0;i<NumberOfLetters;i++) C[i]=0; 
    for (j=0;j<quantity;j++) 
     C[A[j][0]-96]++; 
    for (i=1;i<=NumberOfLetters;i++) 
     C[i] += C[i-1]; 
    for (j=MaxStringNumber-1;j>=0;j--) 
     B[--C[A[j][0]-96]]=A[j]; 
} 

void printing(char **array, int quantity){ 
int i; 
    for (i=0;i<quantity;i++) 
    printf("%s \n", array[i]); 
} 

void reading(char **array, int quantity){ 
char word[MaxStringLength+1]; 
int i; 
    for (i=0;i<quantity; i++){ 
     scanf("%s",word); 
     array[i] = (char*) malloc(MaxStringLength+1); 
     strcpy(array[i],word); 
    } 
} 

int main(){ 
char **A; 
char **B; 
int *C; 
    A=(char**) malloc((MaxStringNumber)*sizeof(char**)); 
    B=(char**) malloc((MaxStringNumber)*sizeof(char**)); 
    C=(int *) malloc((NumberOfLetters+1)*sizeof(int *)); 

    reading(A,MaxStringNumber); 
    printf("Array A:\n"); 
    printing(A,MaxStringNumber); 
    Count(A,B,C,MaxStringNumber); 
    printf("Sorted:\n"); 
    printing(B,MaxStringNumber); 
    /* clean up */ 
    for(i = 0; i < MaxStringNumber; i++) 
     free(B[i]);  /* or A[i] */ 
    free(C); 
    free(B); 
    free(A); 
    return 0; 
}