Progtwig en C para leer y almacenar cadenas.

Estoy escribiendo un fragmento de código en C que itera T veces y cada vez toma como entrada el texto de una pequeña canción en la que realizará alguna operación de conteo (contando la longitud de cada palabra). Por ahora solo estoy probando si la entrada funciona, y no funciona.

#include  #include  #include  #define MAX_SONG_SIZE 501 int main(void){ int T; scanf("%d", &T); while(T--){ char* song = malloc(MAX_SONG_SIZE); if(song == NULL){ printf("malloc failed"); return 1; } fgets(song, MAX_SONG_SIZE, stdin); printf("foo\n"); free(song); } return 0; } 

Estoy usando fgets () debido a los espacios entre las palabras y la asignación de memoria dinámica porque no puedo usar una matriz para todas las canciones, los caracteres de la iteración anterior permanecerán en la matriz.

Pero hay un problema. Omite los fgets () en la primera iteración, escribiendo solo “foo” y sin esperar a que inserte una cadena.

Este es un ejemplo de cómo se imprime con la entrada inicial “3”:
3
foo
esto es una prueba
foo
otra prueba
foo


Con la sustitución de printf("foo\n"); con printf("<>\n", song); la salida es esta:

 3
<<
>>
test
<<test
>>
another test
<<another test
>>

¿Como puedó resolver esté problema? Si tienes algun consejo eres bienvenido.

Hay un \n en el búfer de entrada, consulte http://c-faq.com/stdio/scanfinterlace.html

Una cita del enlace:

Como regla general, no debe intentar entrelazar llamadas para scanf con llamadas a gets () (o cualquier otra rutina de entrada); El tratamiento peculiar de las nuevas líneas de scanf casi siempre conduce a problemas. O use scanf para leer todo o nada.

Hay un \ n dejado en el búfer de entrada. Una solución es:

 #include  #include  #include  #define MAX_SONG_SIZE 501 int main(void){ int t; scanf("%d", &t); getchar(); char song[MAX_SONG_SIZE]; while(t--){ fgets(song, MAX_SONG_SIZE * sizeof(char), stdin); printf("foo\n"); } return 0; } 

Ver también: ¿Cómo borrar el búfer de entrada en C?