Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

202
Visualizações
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 Respostas
Responde à pergunta

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 Relatório

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 Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda