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

161
Visualizações
Bucle while interminable cuando se ingresa una cadena en una variable que esperaba un valor entero

Mi código C de la siguiente manera

 int main() { int userInput = 0; while (userInput != 4) { printf("Enter a number : "); scanf("%d", &userInput); }; return 0; }

Esto normalmente funciona cuando se ingresa un valor entero. Pero cuando ingresa un valor de cadena , no vuelve a preguntar a una entrada. Va a un bucle sin fin imprimiendo la frase "Introduzca un número". Luego, probé el código de la siguiente manera.

 int main() { int userInput = 0; while (userInput != 4) { userInput = 0; // reset the userInput value printf("Enter a number : "); scanf("%d", &userInput); }; return 0; }

Incluso eso no resolvió mi problema. ¿Por qué está pasando esto? ¿Cómo se puede arreglar?

over 4 years ago · Santiago Trujillo
2 Respostas
Responde à pergunta

0

Debe liberar el búfer de entrada de datos no válidos. Algo como lo siguiente.

 do { printf("Enter a number : "); if ( scanf("%d", &userInput) != 1 ) { scanf( "%*[^\n]" ); userInput = 0; } } while ( userInput != 4 );

Otro enfoque es usar la función fgets para leer la cadena completa en una matriz de caracteres y luego convertirla en un número entero usando strtol y verificar si la conversión fue exitosa.

over 4 years ago · Santiago Trujillo Relatório

0

"Esto normalmente funciona cuando se ingresa un valor entero. Pero cuando se ingresa un valor de cadena, no vuelve a solicitar una entrada".

Si un escaneo de datos no se convierte mediante scanf() , el flujo de entrada, en este caso stdin , no avanza. Cuando se vuelve a llamar a scanf() , intentará escanear y convertir los mismos datos de la misma entrada incorrecta, con el mismo resultado. Esto es lo que causa su bucle infinito. Ingresar caracteres alfabéticos cuando `scanf() está configurado para convertir caracteres numéricos siempre fallará.

La buena noticia es que scanf() devuelve un valor que indica cuántos elementos se convirtieron correctamente. La entrada alfa escaneada con el especificador de formato %d debería dar como resultado la conversión de cero elementos. El código que usa scanf() siempre debe verificar su valor de retorno:

 int num_converted = scanf("%d", &userInput); if(num_converted != 1) { //handle error ... }

Aparte, scanf() es considerado por muchos como un método subóptimo para manejar la entrada del usuario . Por ejemplo

"... le dirá si tuvo éxito o falló, pero solo puede decirle aproximadamente dónde falló, y no cómo ni por qué. Tiene muy pocas oportunidades de hacer una recuperación de errores".
( jamesdlin ).

Considere un método alternativo basado en el uso de fgets() .

Lo siguiente lee la línea de entrada completa en un búfer, elimina los espacios en blanco no deseados y valida la entrada. Solo entonces convierte el búfer de entrada al tipo especificado...

 int main(void) { int userInput = 0; char inBuf[20] = {0}; printf("Enter a number : "); //int num = scanf("%d", &userInput); while (fgets(inBuf, sizeof inBuf, stdin)) { inBuf[strcspn(inBuf, "\r\n")] = 0;//remove unwanted white space if(digits_only(inBuf))//example validation for numeric only input { userInput = atoi(inBuf); printf("\n%d entered, and converted!\n\nctrl-c to exit\n...Or enter a number : \n", userInput); } else { printf("\n%s contains non-numeric characters, it cannot be converted.\n\nctrl-c to exit\n...Or enter a number : \n", inBuf); } }; return 0; } //test for numeric only input //(note that other validations can be coded with expansions //to accommodate float or double, alpha only, etc.) bool digits_only(const char *in) { while(*in) { if(!isdigit(*in)) return false; in++; } return true; }
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