Error al imprimir cadena de carácteres en C

Iniciado por darg94, 21 Octubre 2012, 13:46 PM

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

darg94

He hecho un programa de prueba para testear la impresión de cadenas de carácteres, pero me da el siguiente error:


Aquí es dejo el código para que me puedan ayudar:
//prueba de variables tipo char con cadena de carácteres

#include <stdio.h>

main ()
{

char nombre [100];
char lugar [100];

char a = 164;
char b = 162;
char c = 130;

printf ("C%cmo te llamas\?", b);
scanf ("%100[^\n]", nombre);
printf ("Hola %s, por favor, introduce lo siguiente:\n", nombre);
printf ("D%cnde vives\?", b);
scanf ("%100[^\n]", lugar);
printf ("Ahora sé que te llamas %s y vives en %s.\nEsto fue una prueba de C.\n", c, nombre, lugar, a);

getche();
return 0;
}


El fallo está en el segundo scanf, pero no lo entiendo, porque está exactamente igual que el primero.

DickGumshoe

La función scanf() deja basura en el buffer del teclado. Es decir, cuando pulsas "intro" en el primer scanf(), te lee lo que has puesto, pero deja el '\n' de la tecla "intro" en el buffer. Así, el segundo scanf() obtiene directamente ese '\n' que se dejó, por lo que no podrás introducir nada.

Para solucionarlo, prueba a poner getchar(); justo después de scanf(); Lo que hace es leer un carácter (y, por tanto, el buffer del teclado quedará limpio).

Por cierto, te recomiendo usar gets() para leer cadenas de caracteres  ;)

Un saludo!

darg94

Gracias para ayudar a un novatazo ^^

Funciona perfectamente, gracias. Aver si me acostumbro a poner siempre los getchar

Caster

#3
¡Buenas!

Como consejo, para limpiar el buffer, es mejor que despues de cada scanf pongas esto:

while (getchar() != '\n')
;


O evitar el uso de scanf y en su lugar utilizar otras fucniones como fgets()

Saludos

EDITO: Otro consejo, la forma correcta de declarar main es asi:

int main(int argc, char const *argv[])

Y en el caso de que no vayas a utilizar lo que esta entra los parentesis, se suprime:

int main()

Y al final terminar siempre con return 0;

Saludos

leosansan

Cita de: darg94 en 21 Octubre 2012, 13:46 PM
He hecho un programa de prueba para testear la impresión de cadenas de carácteres, pero me da el siguiente error:
Difícil que te de ese error cuando no tienes ni declarada la variable apellido ni aparece dicho nombre en los printf, además de asignar el símbolo %S de cadenas a caracteres a,b,c.
Supongo que esto es lo que querías hacer:

Código (cpp) [Seleccionar]
#include <stdio.h>

main ()
{
char nombre [100];
char apellido [100];
char lugar [100];
printf ("Como te llamas\?");
scanf ("%s", nombre);
printf ("Hola %s, por favor, introduce lo siguiente: apellido\n",nombre );
scanf ("%s", apellido);
printf ("\nDonde vives\n");
scanf ("%s", lugar);
printf ("\nAhora se que te llamas %s %s y vives en %s.\nEsto fue una prueba de C.\n",  nombre, apellido, lugar);
getchar();
return 0;
}

PD:no hay que limpiar buffer porque todos los printf llevan \n.

DickGumshoe

#5
Leosansan, no tiene declarada la variable apellido porque en su ejemplo, su nombre completo es "Nombre Apellido" (es una sola cadena, ergo no hacen falta dos variables).

Porque el printf lleve '\n' nadie ha dicho que haya que limpiar el buffer, sino porque el scanf() deja un '\n' al pulsar 'intro' (usando "%100[^\n]", %d, %f, etc.; pero usando %s, como bien sale en tu ejemplo, no).

Edito: Otra cosa. "%100[^\n]" permite escribir espacios en una cadena, %s no.

leosansan

Cita de: DickGumshoe en 21 Octubre 2012, 14:31 PM
Leosansan, no tiene declarada la variable apellido porque en su ejemplo, su nombre completo es "Nombre Apellido" (es una sola cadena, ergo no hacen falta dos variables).
Fíjate en y ya me diras de dónde sale eso del código que expuso.

DickGumshoe

Vayamos paso por paso:
Citar-->¿Cómo te llamas? Nombre Apellido --> Variable nombre contiene "Nombre Apellido"
Hola Nombre Apellido, por favor, introduce lo siguiente: (¿Hasta aquí todo bien?)
Dónde vives? Ahora sé que.... -->Al pone su nombre scanf dejó buffer en el teclado, y no ha podido introducir su lugar de residencia. Como la variable no está inicializada, el ordenador coge lo que tenga en ese momento, que en este caso ha sido "¿>"

Esto fue una prueba en C.


leosansan

#8
Cita de: DickGumshoe en 21 Octubre 2012, 14:41 PM
Vayamos paso por paso:
Una imagen vale más que mil palabras:
Código (cpp) [Seleccionar]
#include <stdio.h>

main ()
{
char nombre_apellido [100];
char lugar [100];
printf ("Como te llamas\?");
scanf ("%100[^\n]", nombre_apellido);
printf ("Hola %s, por favor, introduce lo siguiente:\n", nombre_apellido);
printf ("Donde vives\n?");
fflush (stdin);
scanf ("%100[^\n]", lugar);
printf ("Ahora sé que te llamas %s y vives en %s.\nEsto fue una prueba de C.\n", nombre_apellido, lugar);
return 0;
}

Ahora ya introduce nombre y apellidos y lugar con los espacios que quiera y sin que se salte ninguna sentencia.
...Si, ya sé que fflush no es muy querida, pero hace su labor; otra opción es la apuntada por Caster.

darg94

Porqué es mejor declarar main así?

int main()

y porqué sugieres tambien declararlo así?

int main(int argc, char const *argv[])


Gracias