scanf se omite [duplicado]

Resuelto Austin Davis asked hace 11 años • 1 respuestas

Estoy intentando crear un programa C simple para una clase y uno de los requisitos es que debo usar scanf/ printfpara todas las entradas y salidas. Mi pregunta es ¿por qué mi scanfbucle for posterior en el archivo principal se omite y el programa simplemente finaliza?

Aquí está mi código.

#include <stdio.h>

void main() {
    int userValue;
    int x;
    char c;

    printf("Enter a number : ");
    scanf("%d", &userValue);
    printf("The odd prime values are:\n");
    for (x = 3; x <= userValue; x = x + 2) {
        int a;
        a = isPrime(x);
        if (a = 1) { 
            printf("%d is an odd prime\n", x);
        }
    }   
    printf("hit anything to terminate...");
    scanf("%c", &c);    
}

int isPrime(int number) {
    int i;
    for (i = 2; i < number; i++) {
        if (number % i == 0 && i != number)
            return 0;
    }
    return 1;
}

Pude "arreglarlo" agregando otro idéntico scanfdespués del primero, pero preferiría usar solo ese.

Austin Davis avatar Jan 23 '13 23:01 Austin Davis
Aceptado

El carácter de nueva línea presente stdindespués de ingresar el anterior intno habrá sido consumido por la última llamada a scanf(). Entonces, la llamada scanf()después del forbucle consume el carácter de nueva línea y continúa sin que el usuario tenga que ingresar nada.

Para corregir sin tener que agregar otra scanf()llamada, puede usar " %c"el especificador de formato scanf()después del forciclo. Esto hará que scanf()se omitan los espacios en blanco iniciales (incluida la nueva línea). Tenga en cuenta que significa que el usuario tendrá que ingresar algo más que una nueva línea para finalizar el programa.

Además:

  • verifique el resultado de scanf()para asegurarse de que realmente asigna un valor a las variables pasadas:

    /* scanf() returns number of assigments made. */
    if (scanf("%d", &userValue) == 1)
    
  • esta es una tarea (y siempre será cierta):

    if (a = 1){ /* Use == for equality check.
                   Note 'a' could be removed entirely and
                   replace with: if (isPrime(x)) */
    
hmjd avatar Jan 23 '2013 16:01 hmjd