Мне нужно написать алгоритм сортировки подсчета, который сортирует строки по первой букве (неважно, является ли это капиталом или малым), но есть ошибка сегментации (сбрасывание ядра) после записи всех строк. Существуют также некоторые предупреждения (ниже)подсчет сортировки со строками [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;
}
Исправить предупреждения. В такой маленькой программе никогда не должно быть никаких предупреждений. 'С [(INT) A [J]]'. Чего вы ожидаете достичь с помощью указателя как индекса массива? – kaylum
Программа даже не имеет смысла. Я бы рекомендовал начать с абсолютных основ C. @kaylum. Меня больше беспокоит использование символа 'char' в качестве указателя. – EOF
Способ, которым вы написали этот код - используя глобальные переменные для A, B и C; имеющие магические числа, такие как 96 и короткие имена, такие как A, B и C; и используя 1-индексирование в массиве - все это, вероятно, повлияет на то, почему вы столкнулись с проблемами здесь. Я думаю, что вы можете захотеть перестроить этот код, чтобы избежать глобальных переменных и использовать более выразительные имена, чтобы сделать вещи более ясными. – templatetypedef