Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

204
Views
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 answers
Answer question

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 Report

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 Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!