1

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("\n\nOtro? (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!!!

Paul
  • 21
  • 3
  • cual es el código de `introducirPosicionB` e `introducirPosicionA`?? – eferion Oct 06 '20 at 11:51
  • ```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); }``` ambos son iguales – Paul Oct 06 '20 at 11:54
  • Por favor, edita la pregunta y pon el código ahí – eferion Oct 06 '20 at 11:55
  • Se necesitan dos porque A es fijo pero B va cambiando cada vez que se repita, entre leer a B y repetir el programa me falta introducir una función para calcular a que distancia están pero todavía no la tengo terminada y la quite por si era el problema. – Paul Oct 06 '20 at 11:57
  • Cuando se ejecuta la funcion `introducirPosiciónA` el buffer del teclado queda sucio.. Asi que cuando intentes pedir el caracter, no pausara el programa. Tienes varias soluciones, la primera es [limpiar el buffer](https://es.stackoverflow.com/questions/233445/diferencias-entre-limpiar-el-b%c3%bafer-en-c) antes del `scanf("%c", ..)` o lo que puedes hacer, es descartar el salto de linea de esta forma: `scanf(" %c", &eleccion)` (dejando un espacio antes del especificador). – MrDave1999 Oct 06 '20 at 14:37
  • Muchas gracias, ```scanf(" %c", &eleccion)``` funciona!!! – Paul Oct 06 '20 at 14:56

1 Answers1

2

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 '\r\n', 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("\n\nOtro? (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
Candid Moe
  • 21,247
  • 9
  • 18
  • 40
  • Gracias, no sabia lo que significaba %*c pero sigue sin funcionar – Paul Oct 06 '20 at 12:15
  • @Paul. Agregue un ejemplo en mi respuesta para ilustrar mejor el punto. – Candid Moe Oct 06 '20 at 12:20
  • Eliminado el código anterior y escribiendo el tuyo de la demo si espera a la respuesta y para al introducir n. Si vuelvo a meter la función externa (introducirPosicion) no para nunca – Paul Oct 06 '20 at 14:06
  • @Paul. En `introducirPosicion` tienes el mismo problema de no leer el '\n' con que termina el valor en punto flotante. – Candid Moe Oct 06 '20 at 14:11