Scanf no está escaneando el carácter %c pero omite la declaración, ¿por qué? [duplicate]

4 minutos de lectura

Scanf no esta escaneando el caracter c pero omite la
psrag anvesh

Escribí un programa usando la declaración de cambio de caso y pedí un carácter para la entrada, pero no solicita el carácter en la ventana de la consola, sino que lo omite por completo.

int main() 
{
    float a, b, ans;
    char opr;

    printf("\nGIVE THE VALUES OF THE TWO NUMBERS\n");
    scanf(" %f %f",&a,&b);


    printf("\nGIVE THE REQUIRED OPERATOR\n");   

    //no display(echo) on the screen
    //opr = getch();
    //displays on the screen
    //opr = getche();

    scanf("%c",&opr);

    switch(opr)
    {
        case '+' :
            ans = a+b;
            printf("%f", ans);
            break;          
        case '-' :
            ans = a-b;
            printf("%f", ans);
            break;          
        case '*' :
            ans = a*b;
            printf("%f", ans);
            break;          
        case "https://stackoverflow.com/" :
            ans = a/b;
            printf("%f", ans);
            break;
        case '%' :
            ans = (int)a % (int)b;
            printf("%f", ans);
            break;
        default :
            printf("\nGIVE A VALID OPRATOR\n");

    }

    system("pause");        
    return 0;

pero cuando pongo un espacio antes %c en el segundo scanf funciona, alguien estaba diciendo algo sobre un espacio en blanco que encontré confuso

dijo el segundo scanf está tomando el valor de \n como personaje y si pongo un espacio antes %c en el segundo scanf ¿No es eso un personaje y no ocupa el espacio como personaje?

Pero en este programa no se necesita el \n como el personaje

int main() 
{
    char a;
    printf("\ngive a char\n");
    scanf("%c",&a);
    printf("%c",a);

    return 0;
}  

Esto es realmente confuso. ¿Puede alguien ayudarme? Quiero saber qué está mal.

  • Es probable que se lea en el carácter de ‘nueva línea’ que ingresa después de insertar los dos números. La entrada funciona como una cola de búfer. Alinea personajes. En este caso, le dijiste que leyera el primer número en &a , omitiera lo que estuviera en el medio, leyera el segundo número en &b y luego leyera el siguiente carácter. Dado que después de ingresar el número en &b, supongo que presionó ‘ENTRAR’, por lo que leerá ‘nueva línea’ en &opr. Una forma rápida de arreglar esto es agregar otra línea de ‘scanf(“%c”,&opr);’ inmediatamente después de su línea de operación scanf.

    – TuanDT

    18 de septiembre de 2015 a las 3:39

  • Pon un espacio antes %c en el segundo scanf. stackoverflow.com/questions/13275417/…

    – Kaylum

    18 de septiembre de 2015 a las 3:40


  • no usar scanf. c-faq.com/stdio/scanfprobs.html

    – jamesdlin

    18 de septiembre de 2015 a las 3:45

  • El espacio en blanco es cualquier carácter “vacío”. Me gusta el espacio y la pestaña. Entonces scanf(" %c", &opr).

    – Kaylum

    18 de septiembre de 2015 a las 3:51


  • @Washington Guedes Si usa scanf("%s", a);cambiar atipo de char[2];. además, scanf("%1s", a);que tiene un riesgo reducido de desbordamiento del búfer es mejor.

    – MikeCAT

    18 de septiembre de 2015 a las 4:33


Cada vez que usa scanf con este formato:

scanf("%c",&a); 

deja una nueva línea que se consumirá en la siguiente iteración. El último programa que mencionaste tiene solo un “scanf”. intenta usar otro scanf. obtendrá el mismo problema.

así que para evitar espacios en blanco tienes que escribir:

 scanf(" %c",&opr); 

el espacio antes de la cadena de formato le dice a scanf que ignore los espacios en blanco. O es mejor usar

getchar();

Consumirá toda tu nueva línea

  • gracias gran explicación y cuál es la diferencia entre getche() y getchar()

    – psrag anvesh

    18 de septiembre de 2015 a las 4:02

  • Si realmente quieres aclarar tu concepto, sigue este enlace: c-lang.thiyagaraaj.com/archive/c-blog/…

    – secretgenes

    18 de septiembre de 2015 a las 4:15


  • Realmente lo haría, pero no me lo permite. Acabo de llegar al sitio web unos minutos antes de hacer la pregunta. Dice que debe tener reputación 15 algo.

    – psrag anvesh

    18 de septiembre de 2015 a las 4:40

  • @psraganvesh: No hay problema… ¡wlcm al stcakoverflow!

    – secretgenes

    18 de septiembre de 2015 a las 4:45

  • gracias hermano…..☺

    – psrag anvesh

    21 de septiembre de 2015 a las 3:34

El problema es que te vas de la \n ingresado después de los números no consumidos y luego es leído por el segundo scanf(). Si marca el valor en opr verás que es ‘\n’.

1647727692 382 Scanf no esta escaneando el caracter c pero omite la
mikecat

El segundo programa toma el \n como el personaje.
Tal vez simplemente no ingresaste \n antes de ingresar otros caracteres.

ejemplo ( %c en printf se cambia a %d Para hacerlo claro)

  • @HaveNoDisplayName ¿Por qué eliminaron mi cotización y la convirtieron en texto sin formato?

    – MikeCAT

    18 de septiembre de 2015 a las 3:41


  • No se requiere cita de texto simple hasta que incluya el error, y el código solo requiere sangría.

    – HaveNoDisplayName

    18 de septiembre de 2015 a las 3:42

  • ¿Por qué simplemente eliminar la cita innecesaria no parece funcionar?

    – MikeCAT

    18 de septiembre de 2015 a las 3:44

Intente agregar fflush (stdin) antes de scanf.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad