C while loop – el código no funcionará

He estado escribiendo un progtwig simple para verificar si la letra de entrada es una vocal y mi código no funciona. El progtwig debe tomar los caracteres como entrada uno por uno hasta que se ingrese%, lo que lo hará salir. Comprueba si los caracteres de entrada son vocales e imprime el resultado. También informa de un error si la entrada no es una letra. El problema es que se sale del bucle en el segundo paso. Gracias por la ayuda, por adelantado. PD: Lo siento, no escribí que no hay ningún mensaje de error, simplemente se sale del bucle.

#include  #include  #include  int main(void) { char processed='q'; while(processed != '%') { printf("Enter letter to check if it's a vowel, %% to quit.\n"); char input = getchar(); processed = tolower(input); printf("%c\n", processed); if (processed == '%') break; if (processed  'z') { fprintf(stderr, "Input should be a letter\n"); exit(1); } switch(processed) { case 'a': case 'e': case 'i': case 'o': case 'u': case 'y': printf ("Vowel\n"); break; default: printf ("Non-vowel\n"); } } exit(0); } 

Probablemente estás ingresando un personaje y luego presionando [ENTER]. Por lo tanto, en realidad está ingresando dos caracteres: la letra que escribió y un salto de línea ( \n ). La segunda vez que atraviesas el bucle, obtienes el salto de línea y descubres que no es una letra, por lo que encuentras el error. Quizás quieras agregar algo como:

 if (processed == '\n') { continue; } 

Alguien más mencionó que estás presionando Enter después de cada letra de entrada y, por lo tanto, envías una nueva línea (‘\ n’) a tu progtwig. Ya que su progtwig no tiene un caso para manejar eso, no está funcionando bien.

Podría agregar código para manejar la nueva línea, pero usar scanf sería más fácil. Específicamente, si reemplaza

 char indent = getchar(); 

con

 char indent; scanf("%c\n", &indent); 

scanf () manejará la nueva línea y solo devolverá las letras que le interesan.

Y debería comprobar el valor de retorno de scanf () para ver si hay errores, por supuesto.