[C] error en scanf("%c",&variable)

Iniciado por edr89, 23 Junio 2013, 00:14 AM

0 Miembros y 1 Visitante están viendo este tema.

edr89

Hola, tengo un problema con algo tan sencillo:

1- Entrada de nombre sin problemas, al dar una nueva linea la entrada de matricula falla
2- como matricula se imprimen datos basura, no te deja escribir nada, por lo tanto la condicion no funciona y lo demas tampoco  :(
int informacion_personal()
{
    char nombre_apellido[50];
    char id[12];
    unsigned short numero_caracteres=0;
    printf("Para finalizar escribe tu nombre y matricula\n\n");
    printf("Nombre: ");
    scanf(" %c",&nombre_apellido);
    printf("\nMatricula: ");
    scanf("%c",&id);
    numero_caracteres = strlen(id);
    if(numero_caracteres>9)
    {
        printf("Demasiados caracteres!\n");
    }
    strcpy(nombre,nombre_apellido);
    printf("%s %s",matricula,nombre);
    getch();
}


No hay mucho que pueda hacer, intente con gets pero al correr se salta la instruccion y no puedes escribir nada, tenia asignado los valores a variables globales (nombre y matricula) pensando que eso era el problema pero no, reasigne a locales y nada.

avesudra

#1
Un despiste tonto, fíjate que estás poniendo el especificador de formato del caracter "%c" no el de cadena "%s" , por lo tanto cambia:
scanf(" %c",&nombre_apellido);
scanf("%c",&id);

Por:
scanf(" %s",&nombre_apellido);
scanf("%s",&id);

De todas maneras te digo que en el nombre_apellido, no vas a poder albergar el nombre y el apellido juntos si utilizas la función scanf tal y como está ya que esta de la cadena "Pepito Jimenez" te leerá "Pepito". Tendrías que ponerlo de esta manera:
scanf(" %s[^\n]",&nombre_apellido);
Regístrate en

MeCraniDOS


Cita de: avesudra en 23 Junio 2013, 00:21 AM
Tendrías que ponerlo de esta manera:
scanf(" %s[^\n]",&nombre_apellido);

También puedes usar
Código (cpp) [Seleccionar]
gets(nombre_apellido);

"La física es el sistema operativo del Universo"
     -- Steven R Garman

avesudra

Cita de: MeCraniDOS en 25 Junio 2013, 01:35 AM
También puedes usar
Código (cpp) [Seleccionar]
gets(nombre_apellido);
Sí lo pensé pero en ese caso creo que es mejor:
Código (cpp) [Seleccionar]
fgets ( &nombre_apellido, 50, stdin );

¡Un saludo!
Regístrate en

edr89

Cita de: avesudra en 23 Junio 2013, 00:21 AM
De todas maneras te digo que en el nombre_apellido, no vas a poder albergar el nombre y el apellido juntos si utilizas la función scanf tal y como está ya que esta de la cadena "Pepito Jimenez" te leerá "Pepito". Tendrías que ponerlo de esta manera:
scanf(" %s[^\n]",&nombre_apellido);

Gracias, acabo de leerlo hace poco, la funcion scanf agrega un caracter nulo cuando lee un espacio en blanco, por eso es que siempre me imprimia la primera parte, lo que no encuentro es
scanf(" %s[^\n]"

Que significa [^\n]? es un especificador de conversion? modificadores de conversion?

Encontre que podria utilizar:
scanf("%s %s",&nombre)
así podria escribir un nombre de dos palabras pero como no tengo la certeza de la longitud queda mejor gets.

Estaba pensando que la funcion gets() falla porque no limpio el buffer antes de escribir la cadena y al entrar la funcion toma lo que esta en el buffer, opte por preguntar los datos al inicio y no al final, entonces todo corre ya como deberia.

En el libro Certified course in C, David Himmel, Waite Group Press, capitulo 4 explican muy bien las funciones printf y scanf, varias paginas resuelven el error.

Perdon por no haber respondido antes pero no tenia internet en la computadora, gracias y saludos!

mr.blood

Bueno, creo que ya resolvieron tus dudas. Solo comentar una cosa:

El scanf funciona con una especie de expresiones regulares, el % indica coger datos, el [^\n] le especificaria que guarde en la variable todo hasta encontrar un \n osea hasta que pulsemos enter. Que alguien me corrija si me equivoco.

Y con toda certeza puedo decirte que evites usar gets(); Es una función que no controla cuantos bytes guarda lo que puede provocarte Overflows varios en tus códigos. Mejor usa fgets.

Sa1uDoS