¿Cómo ordenar cadenas con este código? Estoy fallando en lo básico

Estoy tratando de ordenar los nombres de las ciudades introducidas. El código a continuación me parece correcto, pero si bien se comstack con éxito, no funciona como esperaba.

¿Estoy fallando en la comprensión de los punteros? Déjame corregir si a continuación son ciertas:

  1. tipo de names es un char **
  2. names[0] tipo es char *
  3. Si quiero intercambiar cadenas luego de verificar si son más grandes con strcmp() , tengo que cambiar los valores dentro de los names[i] y names[j] porque los valores dentro de estos valores son punteros a nombres de ciudades reales. Cuando estos se intercambian, apuntan a la matriz de caracteres de cada uno y ya he terminado.

Si mi tercera idea es cierta, tengo que pasar parámetros para cambiar la función como char * porque la función swap tomará los names[i] y los names[j] como parámetros y el tipo de estos son char *.

El pensamiento era como el de arriba mientras escribía el código de abajo. Pero parece que estoy fallando en mi lógica porque el código no funciona como se esperaba.

 #include  #include  #include  int i,j; char *temp; void swap(char *, char *); int main(void){ char *names[4]; //gets city names puts("Enter 4 city names:"); for (i = 0; i < 4; i++) { names[i]=malloc(100); fgets(names[i],99,stdin); } //bubble sort names array and swap if necessary for (i = 0; i < 3; i++) { for (j = i+1; j0 ) { swap(names[i], names[j]); } } } puts("Printing sorted array"); for (i = 0; i < 4; i++) { printf("%s", names[i]); } getch(); } void swap(char *first, char *second){ temp=first; first=second; second=temp; } 

Tu función de intercambio no tiene efecto. Porque siento que no es obvio para ti, probemos con un ejemplo más simple.

Si quisiera intercambiar dos enteros, su función tomaría int lugar de char* . Su función sería (acabo de reemplazar el char* por int ):

 void swap(int first, int second){ int temp=first; first=second; second=temp; } 

Cuando llama a swap (a, b) con las variables a y b 2 int , sus valores se copian en first en second . Luego intercambias el contenido de las variables first y second . El punto importante es que no cambia las variables originales a y b .

La función correcta sería:

 void swap(int *first, int *second){ int temp=*first; *first=*second; *second=temp; } 

Porque de esa manera, usted pasa la dirección de las variables y modifica las variables originales de esta manera. Si no está claro, debe documentarse sobre qué es un puntero y cómo funciona.

Ahora, puedes volver a cambiar el int por un char* :

 void swap(char **first, char **second){ char* temp=*first; *first=*second; *second=temp; } 

Necesitas pasar un puntero al puntero:

 void swap(char **first, char **second) { char *temp = *first; *first = *second; *second = temp; } 

Como estaba, solo está modificando la copia del puntero, no el original. Usamos punteros para ver el original … por lo tanto, necesita un puntero a un puntero; Estás modificando un puntero !!

Para rodearlo con tu cabeza, te recomiendo que cambies tus punteros a cadenas por caracteres y los clasifiques en su lugar. Si se tratara de ints, la función de intercambio se vería así:

 void swap(int first, int second) // These ints/parameters have been copied { first = second; // This only modifies the local copy // etc.. } 

Para modificar los valores originales necesitarías usar un puntero:

 void swap(int *first, int *second) { *first = *second; // etc... } 

Su función de intercambio no tiene ningún efecto en absoluto en los punteros pasados, necesita cambiarla de esta manera, para que se modifiquen los punteros pasados:

  swap(&names[i], &names[j]); void swap(char **first, char **second) { temp=*first; *first=*second; *second=temp; } 

Su función de intercambio es incorrecta, no puede asignar cadenas como esa. Necesitas algo como esto (no óptimo)

 void swap(char *a, char *b) { char tmp[256]; strcpy(tmp, a); strcpy(a, b); strcpy(b, tmp); } 

Su problema no es con los punteros, sino con las llamadas de función. Cuando pasa un valor a una función y modifica ese valor, la “fuente” del valor no se cambia necesariamente.

 void swap(char **first, char **second) { char *temp; temp=*first; *first=*second; *second=temp; } swap(&names[i], &names[j]); 

O podrías hacerlo así:

 void swap(char **arr, int x, int y) { char *temp; temp = arr[x]; arr[x] = arr[y]; arr[y] = temp; } swap(names, i, j); 

En el primer caso, pasa a la función las dos direcciones, cuyo contenido se va a cambiar. En el segundo, se pasa la dirección de matriz maestra y las dos ubicaciones.

 #include  #include  #include  int i,j; char *temp; void swap(char **, char **); int main(void){ char *names[4]; //gets city names puts("Enter 4 city names:"); for (i = 0; i < 4; i++) { names[i]=malloc(100); fgets(names[i],99,stdin); } //bubble sort names array and swap if necessary for (i = 0; i < 3; i++) { for (j = i+1; j<4 ; j++) { if (strcmp (names[i],names[j]) >0 ) { swap(&names[i], &names[j]); } } } puts("Printing sorted array"); for (i = 0; i < 4; i++) { printf("%s", names[i]); } } void swap(char **first, char **second){ temp=*first; *first=*second; *second=temp; }