Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: jeanmlduarte en 27 Febrero 2017, 18:48 pm



Título: Errores raros después de una compilación normal
Publicado por: jeanmlduarte en 27 Febrero 2017, 18:48 pm
Hola, buenas a todos! me eh comprado um livro/manual de programación c/c++ de  miguel angel acera, y pues con este libro estoy iniciando en este mundo. Utilizo Ubuntu 16.10 - Atom 1.14.3x64, y todos mis programas los compilo através del terminal con el comando gcc -o, y ya es la segunda vez que compilo un ejemplo y me sale un error en el programa. No lo entiendo pues, al momento de la compilación lo único que me avisa que algunas funciones son vulnerables. en el momento que relleno una estructura salta a la segunda estructura dejando el parametro nombre hacia atras sin poder rellenar, no se si me explico dejo una imagen para que se vea mas claro. Gracias antemano!

http://imageshack.com/a/img922/5695/MOwux0.png


Título: Re: Errores raros después de una compilación normal
Publicado por: ivancea96 en 27 Febrero 2017, 18:52 pm
En vez de gets(persona.nombre), utiliza fgets:

Código
  1. fgets(char* cadena, int tamañoCadena, FILE* stream)

Lo llamarías:
Código
  1. fgets(persona.nombre, 30, stdin)


Título: Re: Errores raros después de una compilación normal
Publicado por: jeanmlduarte en 27 Febrero 2017, 19:18 pm
Muchas gracias por contestar ivancea96! ahora el problemas es sobre clang, Atom me decía para que verificara si tuviera instalado clang como compilador y buscando por google un poco encontre como instalarlo y la verdad es que no sabia de su existencia, bien ahora al compilar lo hago de esta manera clang -wall *.c me sale el archivo a.out lo ejecuto con el comando ./a.out y seguimos con el mismo error. Cambie el codigo como indicaste quedando asi.

 for (n=1; n<=3; n++)
    {
      printf ("\n\nNombre: ");
      fgets (persona.nombre, 30, stdin);
      printf("\nEdad: ");
      scanf("%d", &persona.edad);
      fwrite (&persona, sizeof (persona), 1, fichero);
    }


Título: Re: Errores raros después de una compilación normal
Publicado por: ivancea96 en 27 Febrero 2017, 19:55 pm
Bien, el problema es que scanf deja un salto de línea en stdin. fgets lo lee, y da como terminada la lectura. Para ello, puedes usar:
Código
  1. scanf("%d%*c", &n);

Ese %*c lee un caracter y no lo guarda. Esta es la solución rápida.

Otra solución sería leer siempre cadenas y, cuando sea un número, convertirla con la función int atoi(char*)


Título: Re: Errores raros después de una compilación normal
Publicado por: jeanmlduarte en 27 Febrero 2017, 20:12 pm
Bien!! ahora si, muchas gracias, pero a que se deve estos problemas? tiene que ver con las anticuadas versiones de C/C++ con las que estoy aprendiendo?


Título: Re: Errores raros después de una compilación normal
Publicado por: ivancea96 en 27 Febrero 2017, 20:22 pm
No, es cosa del funcionamiento de las funciones, sin más. Tú cuando escribes algo en consola y pulsas enter, se envía esto: "12345\n". Ese salto de línea del final, scanf no lo quita del stream, así que se queda ahí. Entonces, cuando fgets trata de leer la línea, se encuentra con ese '\n'. fgets, como otras funciones, cuando encuentra un '\n', deja de leer, así que ya ni te deja escribir.