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

Error con scanf

Estas en el tema de Error con scanf en el foro de C/C++ en Foros del Web. Hola: Disculpen pero tengo un problema, cree un programa para consultar en este caso nombre y apellido, pero si el usuario al contestar pone un ...
  #1 (permalink)  
Antiguo 07/09/2009, 12:02
 
Fecha de Ingreso: septiembre-2009
Mensajes: 22
Antigüedad: 14 años, 7 meses
Puntos: 0
Exclamación Error con scanf

Hola:

Disculpen pero tengo un problema, cree un programa para consultar en este caso nombre y apellido, pero si el usuario al contestar pone un espacio para añadir su segundo nombre es como si se contestara el de abajo, como puedo evitar que al poner espacio se conteste la otra pregunta.
Mi codigo es este:
Código c:
Ver original
  1. #include <stdio.h>
  2. main(){char uno, dos;
  3.        printf("Nombre(s):");
  4.        scanf("%s", &uno);
  5.        printf("Apellidos:");
  6.        scanf("%s", &dos);
  7.        getch();
  8. }
Asi se ve en la consola:
Código:
Nombre(s):Erick Gustavo
Apellidos:(Esta se quedo con el dato: Gustavo)
A de paso otra pregunta como sele hace para que diga el nombre y el apellido junto a la frace "Tu nombre es:", tengo esto pero no sirve:
Código c:
Ver original
  1. printf("%s", "Tu nombre es:", &uno, " ", &dos);

De antemano Muchas Gracias.
  #2 (permalink)  
Antiguo 07/09/2009, 17:00
Avatar de Anubis_Slash  
Fecha de Ingreso: mayo-2009
Ubicación: aqui y haya
Mensajes: 173
Antigüedad: 15 años
Puntos: 5
Respuesta: Error con scanf

hola stilua te recomiendo utilizar el gets y hacer un arreglo para contener toda la cadena mira como quedaria:

Código:
void main()
{
	char a[20], b[20]; //aqui se modifica para el arreglo
	printf("Nombre: ");
	gets(a); //se utiliza el gets para recoger la cadena, lee sobre esto
	printf("Apellido: ");
	gets(b);

	printf("El Nombre es: %s %s \n", &a, &b); // forma correcta de desplegar la cadena
	getch();
}
saludos
__________________
Bienvenidos los karmas.
Quejas, sugerencias o dudas, se awantan......
  #3 (permalink)  
Antiguo 07/09/2009, 20:07
 
Fecha de Ingreso: agosto-2009
Ubicación: Republica dominicana
Mensajes: 14
Antigüedad: 14 años, 9 meses
Puntos: 0
Respuesta: Error con scanf

Buenas
Cuando compilo el programa me da este error:
Código:
 warning: the `gets' function is dangerous and should not be used.
pero aún así funciona, con un pequeño problemita...
Si escribo 2 apellidos solo me imprime los apellidos y obvia los nobres, ¿por qué pasa esto, y como se puede solucionar?
Gracias, un saludo
  #4 (permalink)  
Antiguo 08/09/2009, 09:17
Avatar de Anubis_Slash  
Fecha de Ingreso: mayo-2009
Ubicación: aqui y haya
Mensajes: 173
Antigüedad: 15 años
Puntos: 5
Respuesta: Error con scanf

hola jarr18, un warning no es un error, por lo que funciona el programa...

en cuanto a tu duda no entiendo muy bien a que te refieres, podrias explicarte un poco mejor, tal vez con algun ejemplo....

saludos
anubis_slash
__________________
Bienvenidos los karmas.
Quejas, sugerencias o dudas, se awantan......
  #5 (permalink)  
Antiguo 08/09/2009, 23:11
 
Fecha de Ingreso: septiembre-2009
Ubicación: Burgos
Mensajes: 28
Antigüedad: 14 años, 8 meses
Puntos: 1
Respuesta: Error con scanf

Yo también soy partidario de que el código no tenga warnings, porque para algo están... De hecho si tuvieses un compilador de C puro no sólo te saldrían warnings ahí, por ejemplo el comentario de línea en C no se debe hacer así, el main ha de ser int (porque al main se le puede llamar desde otro sitio e interesa saber si ha finalizado bien)...

En cuanto al warning del gets( ) es evidente, no es nada recomendado usarla, si le echas un vistazo al código de verás por qué... De qué te sirve declarar un vector a y un vector b de X espacio si el gets se lo va a saltar a la torera... Para eso declaramos uno dinámico y vamos aumentándolo nosotros... Prueba a meter más carácteres y verás que te los imprime igual. Pero bueno, si es para una aplicación de andar por casa puedes hacer lo que te salga, como si lo llenas de gotos o breaks, allá cada cual con lo que haga.

Poniéndolo así no tendrás el problema de los apellidos, no te saltarán warnings y te evitas el gets( ):
Código c:
Ver original
  1. /*Máximo de carácteres del nombre o apellidos.*/
  2. #define MAX_CAR     20
  3.  
  4. #include<stdio.h>
  5. /*Incluyo conio.h porque en este foro os encanta usar getch() al final pero bue xD.*/
  6. #include<conio.h>
  7.  
  8. int main(){
  9.     char a[MAX_CAR], b[MAX_CAR];
  10.     int i;
  11.    
  12.     printf("Nombre: ");
  13.     i=-1;
  14.     do{
  15.         ++i;
  16.         a[i] = getchar();
  17.     }while(a[i]!='\n' && i<MAX_CAR);
  18.     fflush(stdin);
  19.     a[i]='\0';
  20.    
  21.     printf("Apellido: ");
  22.     i=-1;
  23.     do{
  24.         ++i;
  25.         b[i] = getchar();
  26.     }while(b[i]!='\n' && i<MAX_CAR);
  27.     fflush(stdin);
  28.    
  29.     b[i]='\0';
  30.     printf("El Nombre es: %s %s \n", a, b);
  31.     getch();
  32.     return 0;
  33. }

Como ves la recogida del nombre y los apellidos es exactamente lo mismo, así que podriámos llamar a una función leeCadena(a, MAX_CAR);
  #6 (permalink)  
Antiguo 09/09/2009, 14:18
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Error con scanf

fflush no debe usarse con flujos de entrada; mucho mejor usar fgets (que permite especificar el tamaño del buffer) con stdin y sscanf.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #7 (permalink)  
Antiguo 09/09/2009, 16:31
 
Fecha de Ingreso: septiembre-2009
Ubicación: Burgos
Mensajes: 28
Antigüedad: 14 años, 8 meses
Puntos: 1
Respuesta: Error con scanf

Anda, pues a mí no me habían dicho eso, pero he mirado por ahí y toda la razón.

No te acostarás sin saber algo nuevo ;) Gracias.

Puestos al tema ya, ¿conoces algún sitio en el que aconsejen o desaconsejen en cuanto a esto? Es decir, no hay un ¿"funciones y librerías desaconsejadas" como tal?

Última edición por JuanLVBR; 09/09/2009 a las 16:36
  #8 (permalink)  
Antiguo 11/09/2009, 15:50
 
Fecha de Ingreso: agosto-2009
Mensajes: 4
Antigüedad: 14 años, 8 meses
Puntos: 0
Respuesta: Error con scanf

Pues si, fgets es la mejor opción recomendada por los que saben, solo que hay que tener en cuenta que esta instrucción a diferencia de gets se traga el caracter nueva linea o \n
entonces hay que quitarlo si es necesario.

Además para scanf o printf: cuando usas cadenas no se pone el & antes del nombre de la(s) variable(s).
  #9 (permalink)  
Antiguo 11/09/2009, 16:10
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Error con scanf

En realidad es lo contrario, la cadena devuelta por gets NO incluye el salto de linea, la devuelta por fgets si lo hace.

Claro, el ampersand con cadenas sobra, para un caracter esta %c y para una cadena %s.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO

Última edición por Eternal Idol; 11/09/2009 a las 16:46
  #10 (permalink)  
Antiguo 11/09/2009, 16:14
 
Fecha de Ingreso: septiembre-2009
Ubicación: Burgos
Mensajes: 28
Antigüedad: 14 años, 8 meses
Puntos: 1
Respuesta: Error con scanf

Mmmm... Vale, en eso ya quedó claro que coincidíamos todos antes, y en ninguno de los códigos de este hilo hay un error en los scanf puesto que si se han declarado char, han puesto el &, y si lo han hecho char[], no lo han puesto, aunque perfectamente podría ponerse de modo &*. En cuanto al printf, es evidente que no se pone el & antes de la variable, pero es que no se pone sea cadena o no, no le pasas la dirección de memoria del primer elemento (a no ser que quieras perder tiempo, en realidad indicándole el nombre del vector estás haciéndo eso).
  #11 (permalink)  
Antiguo 11/09/2009, 16:18
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Error con scanf

Usar char y el ampersand con %s en lugar de %c sigue siendo un error de principiantes; ver primer mensaje del hilo, unico lugar donde se usa scanf y se comete el error señalado.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO
  #12 (permalink)  
Antiguo 11/09/2009, 16:19
 
Fecha de Ingreso: septiembre-2009
Ubicación: Burgos
Mensajes: 28
Antigüedad: 14 años, 8 meses
Puntos: 1
Respuesta: Error con scanf

Amigo, en el primer mensaje del hilo, ni falta, ni sobra un &, lo que está mal es que él declaró un char y trata de leer una cadena ;)

Código:
#include <stdio.h>
main(){char uno, dos;
       printf("Nombre(s):");
       scanf("%c", &uno);
       printf("Apellidos:");
       scanf("%c", &dos);
       getch();
}
Perfectamente válido, te guardará un carácter, pero no falta ni sobra un &.

Si quitas el &, de cualquier modo estarás asignando una cadena a "uno" y a "dos", por lo que tendrías que declarar esas cadenas, como no están declaradas, y de hecho, "uno" y "dos", son chars, lo que está primeramente mal es el "%s", no el &.
  #13 (permalink)  
Antiguo 11/09/2009, 16:22
Avatar de Eternal Idol  
Fecha de Ingreso: mayo-2004
Ubicación: Lucentum
Mensajes: 6.192
Antigüedad: 20 años
Puntos: 74
Respuesta: Error con scanf

Nadie dijo eso ... el codigo que acabas de agregar usa %c y no %s como el original.
__________________
¡Peron cumple, Evita dignifica! VIVA PERON CARAJO

Última edición por Eternal Idol; 11/09/2009 a las 16:30
  #14 (permalink)  
Antiguo 11/09/2009, 16:25
 
Fecha de Ingreso: septiembre-2009
Ubicación: Burgos
Mensajes: 28
Antigüedad: 14 años, 8 meses
Puntos: 1
Respuesta: Error con scanf

El caso es que el primer código sin duda estaba mal, pero puede ser por cualquiera de las dos cosas, si quitase el "&" lo que haría es asignar a un char una cadena, por eso se lo "arreglé".
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 07:54.