Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

203
Vistas
C do while loop se repite 2 veces antes de verificar la condición

¿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?

over 4 years ago · Santiago Trujillo
2 Respuestas
Responde la pregunta

0

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);
over 4 years ago · Santiago Trujillo Denunciar

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.

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda