clasificación de cadenas con algoritmo de burbuja

Este código almacena el número de palabras en una variable entera y las palabras en una cadena multidimensional luego clasifican las palabras alfabéticamente usando una función. El problema que tengo está en la llamada de función.

#include #include void sort(char*[50],int); int main () { int i,n=0; char s[50][10]; scanf("%d",&n);//scaning the number of words for(i=0;i<=n;i++)//scaning the words gets(s[i]); sort(s,n); for(i=0;i<=n;i++)//printing the words sorted printf("%s\n",s[i]); } void sort(char*s[50],int n) { int i,j,cmp; char tmp[1][10]; //bubble sorting of words for(i=0; i<n; i++) for(j=0; j0) { strcpy(tmp[0],s[j+1]); strcpy(s[j+1],s[j]); strcpy(s[j],tmp[0]); } } } 

Enciende tus advertencias. char s[50][50] no se puede convertir a char* .

Prueba esto:

 void sort(char(*)[50],int); 

Esto le indica al comstackdor que usted pasa un puntero a al menos un búfer de 50 caracteres. Esto es lo que decrecen las matrices multidimensionales cuando pasan a las funciones.

Y para deshacerse de la noción tonta de que ” char[] es lo mismo que char* “, que por alguna razón todavía se enseña en todas partes, lea esto: http://c-faq.com/aryptr/aryptr2.html

Usted está cerca. Aquí hay una versión de trabajo de su código. Tenga en cuenta que scanf() deja la nueva línea del número para los … fgets() , porque nunca más usará gets() , ¿verdad? … por lo que necesita leer hasta e incluir la nueva línea después del scanf() . Por supuesto, está la interesante pregunta de “¿por qué la gente piensa que es mejor que cuenten los humanos que hacer que las computadoras cuenten en su lugar?” Sería más sensato no molestarse con el conde. Tenga en cuenta que el código revisado valida n para garantizar que no sea mayor que 50.

Código revisado que funciona en líneas de longitud 9 o más cortas

 #include  #include  #include  void sort(char s[50][10], int); int main(void) { int i; int n = 0; char s[50][10]; char line[11]; if (scanf("%d", &n) != 1) { fprintf(stderr, "Failed to read a number\n"); return 1; } if (n <= 0 || n > 50) { fprintf(stderr, "%d is out of the range 1..50\n", n); return 1; } // Gobble rest of first line while ((i = getchar()) != EOF && i != '\n') ; for (i = 0; i < n; i++) { if (fgets(line, sizeof(line), stdin) == 0) break; // Remove newline from input size_t len = strlen(line); assert(len > 0 && len <= sizeof(s[i])); line[len-1] = '\0'; strcpy(s[i], line); } n = i; // In case the file was shorter than stated! printf("Before:\n"); for (i = 0; i < n; i++) printf("%s\n", s[i]); sort(s, n); printf("After:\n"); for (i = 0; i < n; i++) printf("%s\n", s[i]); return 0; } void sort(char s[50][10], int n) { int i, j, cmp; char tmp[10]; if (n <= 1) return; // Already sorted for (i = 0; i < n; i++) { for (j = 0; j < n-1; j++) { cmp = strcmp(s[j], s[j+1]); if (cmp > 0) { strcpy(tmp, s[j+1]); strcpy(s[j+1], s[j]); strcpy(s[j], tmp); } } } } 

Este código lee las líneas en una cadena lo suficientemente larga como para tomar hasta 9 caracteres de datos, una nueva línea y el terminal nulo. Elimina la nueva línea, dejando hasta 9 caracteres de datos y un terminal nulo.

Ejecución de la muestra:

 Before: Number 34 Number 39 Number 32 Number 30 Number 22 Number 34 Number 57 Number 28 Number 30 Number 47 Number 43 Number 23 Number 22 After: Number 22 Number 22 Number 23 Number 28 Number 30 Number 30 Number 32 Number 34 Number 34 Number 39 Number 43 Number 47 Number 57 

Código original que funciona en líneas de longitud 8 o más cortas.

 #include  #include  #include  void sort(char s[50][10], int); int main(void) { int i; int n = 0; char s[50][10]; if (scanf("%d", &n) != 1) { fprintf(stderr, "Failed to read a number\n"); return 1; } if (n <= 0 || n > 50) { fprintf(stderr, "%d is out of the range 1..50\n", n); return 1; } // Gobble rest of first line while ((i = getchar()) != EOF && i != '\n') ; for (i = 0; i < n; i++) { if (fgets(s[i], sizeof(s[i]), stdin) == 0) break; // Remove newline from input size_t len = strlen(s[i]); assert(len > 0); s[i][len-1] = '\0'; } n = i; // In case the file was shorter than stated! printf("Before:\n"); for (i = 0; i < n; i++) printf("%s\n", s[i]); sort(s, n); printf("After:\n"); for (i = 0; i < n; i++) printf("%s\n", s[i]); return 0; } void sort(char s[50][10], int n) { int i, j, cmp; char tmp[10]; if (n <= 1) return; // Already sorted for (i = 0; i < n; i++) { for (j = 0; j < n-1; j++) { cmp = strcmp(s[j], s[j+1]); if (cmp > 0) { strcpy(tmp, s[j+1]); strcpy(s[j+1], s[j]); strcpy(s[j], tmp); } } } } 

El cambio ‘grande’ es la forma en que se declara y define el parámetro de matriz de funciones. Está pasando una matriz de 50 filas con 10 caracteres por fila, así que simplemente especifique eso en la función. Podrías eliminar los 50 desde las dimensiones del parámetro de función sin cambiar el comportamiento del progtwig.

Ejemplo de entrada:

 8 fed abc cba def hij cba xyz aaa 

Ejecución de ejemplo:

 $ ./srt < data Before: fed abc cba def hij cba xyz aaa After: aaa abc cba cba def fed hij xyz $ 

El hecho de que sea necesario revisar esto muestra la importancia de probar los límites (y de definirlos cuidadosamente).

El código revisado todavía no es un código de propósito general. El límite fijo de a lo sumo 50 líneas de entrada, la cuenta del número de líneas requeridas como parte de la entrada y la longitud de línea fija de a lo sumo 10 caracteres por línea lo convierten en un código de juguete. Como tal, GIGO (basura dentro, basura fuera) no es una reacción irrazonable. Si el archivo de datos contiene líneas demasiado largas, obtienes lo que obtienes. El código no falla, pero la salida puede no tener mucho sentido.

cambio

 void sort(char*[50],int); ... void sort(char*s[50],int n) 

a

 void sort(char(*)[10],int);//not char(*)[50] ... void sort(char(*s)[10],int n) 

y

 //remain newline scanf("%d",&n); 

a

 scanf("%d%*c",&n);//read and drop newline 

así que cambia

 for(i=0;i<=n;i++) 

a

 for(i=0;i 

o

 char *p[50]; for(i=0;i