Errores raros después de una compilación normal

Iniciado por jeanmlduarte, 27 Febrero 2017, 18:48 PM

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

jeanmlduarte

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

ivancea96

En vez de gets(persona.nombre), utiliza fgets:

fgets(char* cadena, int tamañoCadena, FILE* stream)

Lo llamarías:
fgets(persona.nombre, 30, stdin)

jeanmlduarte

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);
    }

ivancea96

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:
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*)

jeanmlduarte

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?

ivancea96

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.