scanf siendo omitido [duplicate]

3 minutos de lectura

avatar de usuario
austin davis

Estoy tratando de hacer un programa C simple para una clase y uno de los requisitos es que debo usar scanf/printf para todas las entradas y salidas. Mi pregunta es ¿por qué mi scanf después de que se omita el bucle for en el main y el programa simplemente termine.

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 scanf después del primero, pero preferiría usar solo uno.

  • Has probado system("PAUSE");?

    – Cole Tobin

    23 de enero de 2013 a las 17:34

  • ¿Está disponible en C puro o solo en C++?

    – Austin Davis

    23 de enero de 2013 a las 18:12

  • Recta c. ¿Notas la falta de un espacio de nombres?

    – Cole Tobin

    23 de enero de 2013 a las 21:24

avatar de usuario
hmjd

El carácter de nueva línea presente en stdin después del anterior int ingresado no habrá sido consumido por la última llamada a scanf(). Entonces la llamada a scanf() después de la for loop consume el carácter de nueva línea y continúa sin que el usuario tenga que ingresar nada.

Para corregir sin tener que añadir otro scanf() llame, podría usar el especificador de formato " %c" en el scanf() después de la for círculo. esto hará scanf() omita cualquier carácter de espacio en blanco inicial (incluida la nueva línea). Tenga en cuenta que significa que el usuario tendrá que ingresar algo que no sea una nueva línea para finalizar el programa.

Además:

  • comprobar el resultado de scanf() para asegurarse de que realmente asigne 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)) */
    

  • ¿Por qué no habría sido consumido por la última llamada a scanf()? Perdón nueva pregunta

    – SSH Esto

    23 de enero de 2013 a las 16:31

  • @SSHEsto, scanf("%d") deja de consumir cuando encuentra algo que no es un dígito, y una nueva línea no es un dígito, por lo que permanecerá.

    – hmjd

    23 de enero de 2013 a las 16:32

  • gracias por detectar ese error

    – Austin Davis

    23 de enero de 2013 a las 16:34

  • Gracias, debería ser scanf("%d\n", &userValue);?

    – SSH Esto

    23 de enero de 2013 a las 16:34

  • @SSH Esto, sí. Eso también funcionaría.

    – hmjd

    23 de enero de 2013 a las 16:39

¿Ha sido útil esta solución?