La palabra más larga y la más corta en una progtwigción de archivo C

Hola y buenas noches,

Así que estoy escribiendo un progtwig en C, que aceptará un archivo.txt como entrada y leerá el texto. El progtwig debe leer el archivo de texto, buscar la palabra más larga y la más corta dentro del archivo e imprimirlas cuando llegue al final.

Estoy REALMENTE cerca, pero tengo una falla de seguridad y, no solo no sé por qué, sino que también no sé cómo solucionarlo.

Aquí está el código:

#include  #include  FILE *fp; char str[60]; char *largest; char *smallest; char *word; int i, j; int main (int argc, char **argv) { // check that there are only two arguments if (argc == 2) { fp = fopen(argv[1], "r"); } // if not throw this error else { perror("Argument error."); return (-1); } // check if the file exists if (fp == NULL) { perror("Error opening file."); return (-1); } // set largest to first string and smallest to second largest = strcpy(largest, strtok(str, " ")); smallest = strcpy(smallest, strtok(NULL, " ")); word = strcpy(word, strtok(str, " ")); // while we get lines of the file while (fgets (str, 60, fp) != NULL) { // while the token string isn't empty while (word != NULL) { if (strlen(largest) > strlen(word)) { strcpy(word, largest); } if (strlen(smallest) < strlen(word)) { strcpy(word, smallest); } } } printf("The largest word in the file is: %s", largest); printf("The smallest word in the file is: %s", smallest); fclose(fp); return 0; } 

Estoy bastante seguro de que es el segundo bucle while … No quiero usarlo de todos modos, pero he estado pirateando esto durante tanto tiempo que solo puedo pensar en mi lógica.

Cualquier ayuda sería apreciada. Esta es la tarea, aunque solo es una pequeña parte de ella, y no estoy pidiendo ayuda para resolver todo el problema.

Además, hay un Makefile involucrado … No creo que sea una publicación importante, pero no dude en preguntarme y actualizaré.

Cuando construí esto, puedo confirmar que el archivo es capaz de leer y que puedo imprimir, poner y hacer todo tipo de cosas geniales. Solo se rompió cuando intenté implementar mi lógica para la palabra más larga / más corta.

¡Gracias!

Hay algunos problemas con tu lógica. Pruebe el siguiente código

Pocos supuestos que hice son,

La longitud máxima de la palabra es de 20 caracteres. Puedes cambiarlo por la macro MAX_WORD_LENGTH. Las palabras en el archivo están separadas por espacios. La longitud máxima de la línea es de 60 caracteres.

 #include  #include  #include  #define MAX_WORD_LENGTH 20 int main (int argc, char **argv) { FILE *fp; char str[60]; char *largest = (char*) malloc (MAX_WORD_LENGTH); char *smallest = (char*) malloc (MAX_WORD_LENGTH); int smallest_len = MAX_WORD_LENGTH, largest_len = 0; if (argc == 2) { fp = fopen(argv[1], "r"); } else { printf("Argument error."); return (-1); } if (fp == NULL) { printf("Error opening file."); return (-1); } while (fgets (str, 60, fp) != NULL) { char *temp = strtok(str, " "); while (temp != NULL) { if (strlen(temp) > largest_len) { strcpy(largest, temp); largest_len = strlen(largest); } if (strlen(temp) < smallest_len) { strcpy(smallest, temp); smallest_len = strlen(smallest); } temp = strtok(NULL, " "); } } printf("The largest word in the file is: %s\n", largest); printf("The smallest word in the file is: %s\n", smallest); fclose(fp); return 0; } 

Adoptalo para tus necesidades con argv [2]

y disfrutar

 #include  #include  int main() { const int max_word_length = 60; char longest[max_word_length]; char shortest[max_word_length]; char current[max_word_length]; size_t longest_length = 0; size_t shortest_length = max_word_length; size_t current_length = 0; freopen("input", "r", stdin); freopen("output", "w", stdout); while (scanf("%s", current) > 0) { current_length = strlen(current); if ( current_length > longest_length) { longest_length = current_length; strcpy(longest, current); } if (current_length < shortest_length) { shortest_length = current_length; strcpy(shortest, current); } } printf("%s %s", shortest, longest); return 0; } 

Así que acabo de ejecutar esto en línea y parece que la falla de seg es causada por la línea

 largest = strcpy(largest, strtok(str, " ")); 

Esto se debe a que largest es el destino de la copia de cadena en la llamada

 strcpy(largest, strtok(str, " ")); 

Pero es un puntero que apunta a nada. Se debe declarar como una matriz real como esta:

 char largest[60]; 

Además, no deberías estar llamando strtok en una str cuando no se haya inicializado a nada. Ni siquiera es una cadena adecuada, así que no hay forma de que strtok haga algo útil en ese momento.