Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: darg94 en 21 Octubre 2012, 13:46 pm



Título: Error al imprimir cadena de carácteres en C
Publicado por: 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:
(http://imageshack.us/a/img51/9726/capturamg.jpg)

Aquí es dejo el código para que me puedan ayudar:
Código:
//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.


Título: Re: Error al imprimir cadena de carácteres en C
Publicado por: DickGumshoe en 21 Octubre 2012, 13:55 pm
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!


Título: Re: Error al imprimir cadena de carácteres en C
Publicado por: darg94 en 21 Octubre 2012, 14:00 pm
Gracias para ayudar a un novatazo ^^

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


Título: Re: Error al imprimir cadena de carácteres en C
Publicado por: Caster en 21 Octubre 2012, 14:17 pm
¡Buenas!

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

Código
  1. while (getchar() != '\n')
  2. ;

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:

Código
  1. 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:

Código
  1. int main()

Y al final terminar siempre con return 0;

Saludos


Título: Re: Error al imprimir cadena de carácteres en C
Publicado por: leosansan en 21 Octubre 2012, 14:25 pm
He hecho un programa de prueba para testear la impresión de cadenas de carácteres, pero me da el siguiente error:
(http://imageshack.us/a/img51/9726/capturamg.jpg)
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
  1. #include <stdio.h>
  2.  
  3. main ()
  4. {
  5. char nombre [100];
  6. char apellido [100];
  7. char lugar [100];
  8. printf ("Como te llamas\?");
  9. scanf ("%s", nombre);
  10. printf ("Hola %s, por favor, introduce lo siguiente: apellido\n",nombre );
  11. scanf ("%s", apellido);
  12. printf ("\nDonde vives\n");
  13. scanf ("%s", lugar);
  14. printf ("\nAhora se que te llamas %s %s y vives en %s.\nEsto fue una prueba de C.\n",  nombre, apellido, lugar);
  15. getchar();
  16. return 0;
  17. }
PD:no hay que limpiar buffer porque todos los printf llevan \n.


Título: Re: Error al imprimir cadena de carácteres en C
Publicado por: 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).

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.


Título: Re: Error al imprimir cadena de carácteres en C
Publicado por: leosansan en 21 Octubre 2012, 14:36 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 (http://imageshack.us/a/img51/9726/capturamg.jpg) y ya me diras de dónde sale eso del código que expuso.


Título: Re: Error al imprimir cadena de carácteres en C
Publicado por: DickGumshoe en 21 Octubre 2012, 14:41 pm
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.



Título: Re: Error al imprimir cadena de carácteres en C
Publicado por: leosansan en 21 Octubre 2012, 14:54 pm
Vayamos paso por paso:
Una imagen vale más que mil palabras:
Código
  1. #include <stdio.h>
  2.  
  3. main ()
  4. {
  5. char nombre_apellido [100];
  6. char lugar [100];
  7. printf ("Como te llamas\?");
  8. scanf ("%100[^\n]", nombre_apellido);
  9. printf ("Hola %s, por favor, introduce lo siguiente:\n", nombre_apellido);
  10. printf ("Donde vives\n?");
  11. fflush (stdin);
  12. scanf ("%100[^\n]", lugar);
  13. printf ("Ahora sé que te llamas %s y vives en %s.\nEsto fue una prueba de C.\n", nombre_apellido, lugar);
  14. return 0;
  15. }
  16.  
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.


Título: Re: Error al imprimir cadena de carácteres en C
Publicado por: darg94 en 21 Octubre 2012, 15:00 pm
Porqué es mejor declarar main así?
Código:
int main()
y porqué sugieres tambien declararlo así?
Código:
int main(int argc, char const *argv[])

Gracias


Título: Re: Error al imprimir cadena de carácteres en C
Publicado por: darg94 en 21 Octubre 2012, 15:07 pm
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.

copialo, pegalo, compilalo y ejecutalo


Título: Re: Error al imprimir cadena de carácteres en C
Publicado por: Caster en 21 Octubre 2012, 15:09 pm
El error esta en que cuando introduce la primera cadena, en el buffer queda un salto de linea '\n' entonces al siguiente scanf ya no deja introducir nada, para esto la solucion es limpiar el buffer. Respecto a los caracteres a,b y c los esta utilizando para que aparezcan los acentos, entonces en el segundo printf da error porque solo estan los caracteres de conversion para las cadenas nombre y lugar, pero no para los caracters, ahi da el error.

Quiero dejar claro que he copiado el codigo y lo he compilado y a la hora de introducir la seugnda cadena me da error y se me cierra

Saludos


Título: Re: Error al imprimir cadena de carácteres en C
Publicado por: DickGumshoe en 21 Octubre 2012, 15:09 pm
Leosansan, antes afirmabas esto:

Citar
Difícil que te de ese error cuando no tienes ni declarada la variable apellido ni aparece dicho nombre en los printf

Ahora dices que lo que falla es en que tiene que poner fflush(stdin)... Y precisamente fflush(stdin), además de no ser nada correcto, en este caso la función sería la misma que getchar(), que sí es correcto (y es lo mismo que lo que dijo también Caster)... Creo que estamos dándole muchas vuelvas al tema. Con mi primera respuesta ya solucionó su duda...:

Citar
Gracias para ayudar a un novatazo ^^

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

Darg94, la forma correcta en el estándar de C de la función main es

int main()
{
...
return 0;
}

Es decir, que main es de tipo int en el estándar. El return 0 es porque, como toda función de tipo int, debe devolver algo. Se usa 0 si el programa terminó correctamente, u otro número si hubo algún error.


Título: Re: Error al imprimir cadena de carácteres en C
Publicado por: Caster en 21 Octubre 2012, 15:16 pm
En general es asi:

Código
  1. int main(int argc, char const *argv[])
  2. {
  3. /* code */
  4. return 0;
  5. }

Esto es asi porque en los estandares de C la funcion main() es de tipo int, y por consiguiente al ser de tipo int siempre retornara un valor entero, por eso se escribe return 0;

Se puede utilizar fflush(stdin) para limpiar el buffer, pero es mejor evitar su uso, porque fflush es para el buffer de salida(stdout), si se usa para stdin su comportamiento no tiene porque ser el esperado y producir problemas en la ejecución del programa, la mejor forma es como ya dije mas arriba, asi:

Código
  1. while (getchar() != '\n')
  2. ;
Saludos


Título: Re: Error al imprimir cadena de carácteres en C
Publicado por: darg94 en 21 Octubre 2012, 15:39 pm

Quiero dejar claro que he copiado el codigo y lo he compilado y a la hora de introducir la seugnda cadena me da error y se me cierra

Saludos

oops
mis disculpas,
me olvidé de cambiar esto:
de:
Código:
printf ("Ahora sé que te llamas %s y vives en %s.\nEsto fue una prueba de C.\n", c, nombre, lugar, a);
a
Código:
printf ("Ahora s%c que te llamas %s y vives en %s.\nEsto fue una prueba de C.\n", c, nombre, lugar);