¿Por qué mi ciclo do / while se repite 2 veces antes de verificar la condición?
int main() { char quit; quit = getchar(); do { printf("Next state: "); clock_t start = clock(); count_values(a, b); clock_t end = clock(); float seconds = (float)(end - start) / CLOCKS_PER_SEC; print_state(b); printf("\nTime: %f\n", seconds); swap(a, b); printf("Press enter to print next generation. To quit, enter 'q'."); quit = getchar(); } while(quit != 'q'); return 0; } Solo después de que el ciclo se haya repetido 2 veces, getchar() espera la entrada, ¿por qué? ¿Como arreglarlo?
Probablemente esté dando la entrada manualmente , por lo tanto, cuando presiona la tecla Enter , se deja un carácter de nueva línea que luego es consumido por la segunda llamada getchar() .
Para omitir esto, puede usar fgets() .
char quit[100]; fgets(quit, sizeof(quit), stdin); do { printf("Next state: "); clock_t start = clock(); clock_t end = clock(); float seconds = (float)(end - start) / CLOCKS_PER_SEC; printf("\nTime: %f\n", seconds); printf("Press enter to print next generation. To quit, enter 'q'."); fgets(quit, sizeof(quit), stdin); } while(quit[0] != 'q'); Si bien el código anterior debería hacer el trabajo, uno puede engañar fácilmente al programa escribiendo cualquier cosa que comience con q .
La solución sería usar strcmp() para verificar que la cadena solo contenga "q" .
Tenga en cuenta que fgets() también almacena el carácter de nueva línea en el búfer, para omitirlo, debe reemplazarlo con un byte NULL .
char quit[100]; do { printf("Next state: "); clock_t start = clock(); clock_t end = clock(); float seconds = (float)(end - start) / CLOCKS_PER_SEC; printf("\nTime: %f\n", seconds); printf("Press enter to print next generation. To quit, enter 'q'."); fgets(quit, sizeof(quit), stdin); quit[strcspn(quit, "\n")] = '\0'; /* get rid of \n */ } while(strcmp(quit, "q") != 0);No se repite dos veces antes de comprobar el estado. Puede verificar eso modificando ligeramente su código, lo que también lo convierte en un ejemplo reproducible mínimo:
#include <stdio.h> int test(char c) { printf("Testing input: %d\n", c); return c != 'q'; } int main() { char quit; quit = getchar(); do { printf("Press enter to print next generation. To quit, enter 'q'.\n"); quit = getchar(); } while(test(quit)); return 0; } Puede ver que la entrada ya se está probando después del primer ciclo. No es 'q' , si escribe q entonces [enter] . El q será consumido por quit = getchar(); antes del bucle. Luego, el carácter de nueva línea (10 decimal) se verificará en la condición, y no es q .
Así que tu suposición estaba equivocada.