Foros del Web » Programación para mayores de 30 ;) » C/C++ »

scanf no recoge bien caracteres

Estas en el tema de scanf no recoge bien caracteres en el foro de C/C++ en Foros del Web. Hola, tengo un problema con el siguiente código: Código: int valoresd[parametros[0]]; float valoresf[parametros[0]]; char valoresc[parametros[0]]; char valoress[parametros[0]][100]; if(parametros[1]==1){ printf("Introduzca los valores enteros\n"); for(i=0; i<parametros[0]; i++){ ...
  #1 (permalink)  
Antiguo 25/05/2009, 15:03
Avatar de neandertal  
Fecha de Ingreso: enero-2008
Ubicación: Barcelona
Mensajes: 79
Antigüedad: 16 años, 3 meses
Puntos: 1
scanf no recoge bien caracteres

Hola, tengo un problema con el siguiente código:

Código:
    int valoresd[parametros[0]];
    float valoresf[parametros[0]];
    char valoresc[parametros[0]];
    char valoress[parametros[0]][100];
    if(parametros[1]==1){
                         printf("Introduzca los valores enteros\n");
                         for(i=0; i<parametros[0]; i++){
                                  printf("Valor %d: ",i+1);
                                  scanf("%d",&valoresd[i]);
                         }
    }
    if(parametros[1]==2){
                         printf("Introduzca los valores decimales\n");
                         for(i=0; i<parametros[0]; i++){
                                  printf("Valor %d: ",i+1);
                                  scanf("%f",&valoresf[i]);
                         }
    }
    if(parametros[1]==3){
                         printf("Introduzca los caracteres\n");
                         for(i=0; i<parametros[0]; i++){
                                  printf("Valor %d: ",i+1);
                                  scanf("%c",&valoresc[i]);
                         }
    }
    if(parametros[1]==4){
                         printf("Introduzca las cadenas de caracteres\n");
                          for(i=0; i<parametros[0]; i++){
                                  printf("Valor %d: ",i+1);
                                  scanf("%s",&valoress[i]);
                         }
    }
Donde parametros[1] es un valor numérico que solo puede tener valores enteros del 1 al 4.

Cuando parametros[1] es 1,2 o 4 funciona perfecto y sin ningún problema, pero cuando parametros[1] es 3, entonces es como si no me cogiera bien el scanf,

La salida normal del programa en 1,2 i 4 es:

Valor 1: <espera a que introduzca valor>
Valor 2: <espera a que introduzca valor>
Valor 3: <espera a que introduzca valor>
Valor parametros[0]: <espera a que introduzca valor>

Pero en parametros[1]==3 me da la siguiente salida:

Valor 1:Valor 2: <espera a que introduzca valor>
Valor 3:Valor 4: <espera a que introduzca valor>
Valor parametros[0]-1:Valor parametros[0]: <espera a que introduzca valor>


He comprobado los valores de parametros[0] y parametros[1] cuando entra en el if, pero no encuentro el problema por ninguna parte, y las estructuras de los 4 condicionales son exactamente iguales.

Estoy muy frustrado con este problema...
  #2 (permalink)  
Antiguo 26/05/2009, 02:18
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: scanf no recoge bien caracteres

Usa fgets (con stdin) y sscanf.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #3 (permalink)  
Antiguo 26/05/2009, 05:11
Avatar de neandertal  
Fecha de Ingreso: enero-2008
Ubicación: Barcelona
Mensajes: 79
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: scanf no recoge bien caracteres

No entiendo...

fgets no sirve para coger un valor de un archivo externo ???

Y según he leído sscanf sirve para recoger cadenas, podrías explicarte un poco mejor ??
  #4 (permalink)  
Antiguo 26/05/2009, 05:27
Avatar de hades87  
Fecha de Ingreso: diciembre-2007
Ubicación: Barcelona - España
Mensajes: 3.194
Antigüedad: 16 años, 4 meses
Puntos: 68
Respuesta: scanf no recoge bien caracteres

si quieres coger strings con scanf, puedes probar este método:

scanf("%[^\n]", nomvar);

yo es el que uso apra pillar cadenas de carácteres, y despues del scanf has de poner un flushall();
__________________
No diseñes usando tablas.
  #5 (permalink)  
Antiguo 26/05/2009, 05:30
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: scanf no recoge bien caracteres

No necesariamente ya que podes usar stdin:

Código:
char line[80];
memset(line, 0, sizeof(line));
fgets(line, sizeof(line), stdin);
sscanf(line, "%d", &valoresd[i]);

De esta manera obvias el uso de scanf que deja basura en el buffer y no hace falta ningun tipo de funcion de limpieza del mismo. Ademas de pasar el tamaño del buffer para la funcion de entrada que es mucho mas seguro ...
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #6 (permalink)  
Antiguo 26/05/2009, 15:43
Avatar de neandertal  
Fecha de Ingreso: enero-2008
Ubicación: Barcelona
Mensajes: 79
Antigüedad: 16 años, 3 meses
Puntos: 1
Busqueda Respuesta: scanf no recoge bien caracteres

A ver si me aclaro, porque hace poco que he empezado a programar y no se demasiado.

Lo que hace memset es llenar todo el array line[] de 0.
Entonces con fgets capturas x caracteres de stdin (la longitud del array) - aqui en teoria lee los últimos valores que hay en stdin ?? - y los introduces en el array.
Entonces con sscanf copias el contenido de line[] en valoresc[]

Dices que scanf deja basura en el buffer, a que te refieres con eso ? Por que no pasa cuando introduzco números ?

No acabo de entender lo que dices, les pido que tengan un poco de paciencia conmigo...
  #7 (permalink)  
Antiguo 26/05/2009, 15:52
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: scanf no recoge bien caracteres

Si, probalo a ver si podes hacerlo funcionar tal como queres.

¿No tenes problemas al leer datos con scanf?
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #8 (permalink)  
Antiguo 27/05/2009, 07:41
Avatar de neandertal  
Fecha de Ingreso: enero-2008
Ubicación: Barcelona
Mensajes: 79
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: scanf no recoge bien caracteres

He estado intentando el código que me comentas, pero como no habia manera, he probado con fflush y me ha funcionado bien.

Lo que no entiendo de tu código es que lees n valores de stdin, pero yo los valores que necesito todavia no se han introducido en el.

De todas maneras, se agradece la ayuda que me han prestado. Gracias !
  #9 (permalink)  
Antiguo 27/05/2009, 07:46
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: scanf no recoge bien caracteres

Si usaste fflush con stdin es una mala solucion no standard (podes googlearlo) y de la forma que te dije podes obviarla (el punto es que no hace falta limpiar si primero no ensucias) ... si lee valores de stdin, tal y como lo hace scanf solo que con mayor control y sin dejar basura en el buffer ...
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #10 (permalink)  
Antiguo 27/05/2009, 10:18
Avatar de neandertal  
Fecha de Ingreso: enero-2008
Ubicación: Barcelona
Mensajes: 79
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: scanf no recoge bien caracteres

Lo he probado pero no me funciona, es decir, lo compila bien sin ningún error, pero en el fgets cuando tendria que pararse a esperar a que introduzca los caracteres no lo hace y finaliza el programa.
  #11 (permalink)  
Antiguo 27/05/2009, 10:59
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: scanf no recoge bien caracteres

Si finaliza el programa estaras haciendo algo mal ... depuralo.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #12 (permalink)  
Antiguo 27/05/2009, 12:01
Avatar de neandertal  
Fecha de Ingreso: enero-2008
Ubicación: Barcelona
Mensajes: 79
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: scanf no recoge bien caracteres

Copio el código que tengo ahora.

Código:
int valoresd[parametros[0]];
    float valoresf[parametros[0]];
    char valoresc[parametros[0]];
    char valoress[parametros[0]][100];
    if(parametros[1]==1){
                         printf("Introduzca los valores ENTEROS\n");
                         for(i=0; i<parametros[0]; i++){
                                  printf("Valor %d: ",i+1);
                                  scanf("%d",&valoresd[i]);
                         }
    }
    if(parametros[1]==2){
                         printf("Introduzca los valores DECIMALES\n");
                         for(i=0; i<parametros[0]; i++){
                                  printf("Valor %d: ",i+1);
                                  scanf("%f",&valoresf[i]);
                         }
    }
    if(parametros[1]==3){
                         printf("Introduzca los CARACTERES\n"); 
                         char line[80];
                         memset(line, 0, sizeof(line));
                         fgets(line, sizeof(line), stdin); 
                         sscanf(line, "%c", &valoresc[i]);
    }
    if(parametros[1]==4){
                         printf("Introduzca las CADENAS DE CARACTERES\n");
                         for(i=0; i<parametros[0]; i++){
                                  printf("Valor %d: ",i+1);
                                  scanf("%s",&valoress[i]);
                         }
    }
Cuando decia que el programa finaliza quiero decir que el programa acaba sin ningún error, es decir, que no pide ningún valor al usuario.
La pregunta es:En fgets el programa espera a que el usuario introduzca valores hasta llenar la cadena o copia los últimos valores que hay en la stdin ??
  #13 (permalink)  
Antiguo 27/05/2009, 12:20
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: scanf no recoge bien caracteres

Estas mezclando scanf con fgets ... no uses scanf.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #14 (permalink)  
Antiguo 27/05/2009, 12:53
Avatar de neandertal  
Fecha de Ingreso: enero-2008
Ubicación: Barcelona
Mensajes: 79
Antigüedad: 16 años, 3 meses
Puntos: 1
Respuesta: scanf no recoge bien caracteres

Ok, claro, ya entendí el problema, no me funcionaba porque mezclaba fget y scanf, he rescrito el código usando fget y me funciona bien.

Ahora si gracias por la ayuda.
  #15 (permalink)  
Antiguo 27/05/2009, 13:32
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: scanf no recoge bien caracteres

De nadas
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 10:37.