TransWikia.com

Error al leer un caracter en c

Stack Overflow en español Asked on February 9, 2021

Tengo un pequeño problema con los caracteres en c. En una de las prácticas me piden repetir el programa mientras el usuario decida seguir introduciendo datos.

Este es el programa:

void introducirPosiciónB(float *Xb,float *Yb) {
     printf("Posición (x) de la persona? ");
     scanf("%f",Xb);
     printf("Posición (y) de la persona ");
     scanf("%f",Yb);
}

int main(){
     float Xa, Ya, Xb, Yb;
     char eleccion;
     introducirPosiciónA(&Xa,&Ya,);
     do{
     introducirPosiciónB(&Xb,&Yb);
     printf("nnOtro? (y or n)"); //Aquí esta el problema
     scanf("%c",&eleccion);
     }
     while(eleccion!='n');
     return 0;
 }

Las funciones de dentro del main me vienen ya dadas por lo que eso está bien.

El problema surge cuando al llegar al scanf del carácter avanza sin pararse a leerlo, lo ignora y repite el programa sin dejarte opción a introducir n

He probado también por cambiar el scanf por getch(eleccion) pero tampoco funciona.

Si alguien puede ayudarme lo agradecería mucho.

Gracias por leerlo al menos.

SOLUCIÓN:

scanf(" %c", &eleccion);

Repito muchísimas gracias a todos!!!

One Answer

El problema es que cuando tecleas "n" (cualquier caracter), estás ingresando dos caracteres: "n" y un "n".

Con

scanf("%c",&eleccion);

lees el primer caracter y dejas el "n" en el buffer de entrada. Cuando vas a ejecutar el siguiente scanf, éste encuentra el "n" y te lo devuelve.

Usa esto:

scanf("%c%*c",&eleccion);

El formato %*c, con un asterico entremedio, significa que hay que leer un caracter y descartarlo.

Nota: No he probado esto en Windows; puede que el buffer contenga 'rn', dos caracteres en lugar de uno. Alguien aportara un comentario clarificador.

Demo

Elimine la función introducirPosicion y otras declaraciones irrelevantes. La versión mínima, completa que aborda el problema es:

#include <stdio.h>

int main() {
    char eleccion;
    
    do {
        printf("nnOtro? (y or n)"); //Aquí esta el problema
        scanf("%c%*c", &eleccion);
    } while (eleccion != 'n');
    return 0;
}

produce:

Otro? (y or n)y


Otro? (y or n)n

RUN FINISHED; exit value 0; real time: 2s; user: 0ms; system: 0ms

Answered by Candid Moe on February 9, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP