Mi código toma una serie de palabras como argumentos de línea de comando y debería ordenarlas usando qsort. En este momento, imprimo los argumentos originales; sin embargo, cuando se imprimen los argumentos ordenados, recibo un error de segmentación. Nuevo en C, todos los consejos son apreciados.
#include <stdlib.h> #include <string.h> int stringCmp(const void *str1, const void *str2); //Function prototype. int main (int argc, char *argv[]) { int i; char **arr = malloc(argc * sizeof(char *)); printf("Original Args:\n"); for (i = 0; i < argc-1; i++){ arr[i] = argv[i+1]; printf("%s\n",arr[i]); } qsort(arr, argc, sizeof *arr, stringCmp); printf("\nSorted Args:\n"); for (i = 0; i < argc; i++){ printf("%s\n", arr[i]); } free (arr); return 0; } int stringCmp(const void *str1, const void *str2) { strcmp(str1, str2); }Su función de comparación no devuelve nada. Además, esta función toma la dirección de los elementos de la matriz, por lo que lo que en realidad obtiene es char * const * , no void *
Usted quiere:
int stringCmp(const void *str1, const void *str2) { const char * const *s1 = str1; const char * const *s2 = str2; return strcmp(*s1, *s2); } Tampoco está pasando la cantidad correcta de elementos a qsort . Debería ser argc-1 , no argc . Lo mismo ocurre con la impresión de la lista:
qsort(arr, argc-1, sizeof *arr, stringCmp); printf("\nSorted Args:\n"); for (i = 0; i < argc-1; i++){ printf("%s\n", arr[i]); }Para empezar, está pasando un número no válido de elementos
qsort(arr, argc, sizeof *arr, stringCmp);tienes que escribir
qsort(arr, argc - 1, sizeof *arr, stringCmp); En segundo lugar, la función stringCmp no devuelve nada y usa argumentos incorrectos en la llamada de strcmp . debería verse como
int stringCmp(const void *str1, const void *str2) { return strcmp( *( const char ** )str1, *( const char ** )str2); }fuera por uno aquí también
for (i = 0; i < argc; i++) { printf("%s\n", arr[i]); }debiera ser
for (i = 0; i < argc - 1; i++) { printf("%s\n", arr[i]); }