C program in Xcode -


i have problem c code, hope can me. program making basic book "database". when run following code (in xcode), don't know why following sentence gets skipped:

gets(nombre[i]);

on terminal directly prints following if take option 1 menu:

bienvenido al catalogo de libros.

catalogo de tarjetas: 1. introducir 2. buscar por autor 3. buscar por titulo 4. salir

elija opcion:1 warning: program uses gets(), unsafe.

introduzca el nombre del libro:introduzca el autor del libro:

ok, i've tested scanf("%d", &opcion); using printf("%d", opcion); right after proove scanf reads correctly input. surprisingly, reads option introduce correctly. moreover, i've tried running program no "\n" in part see if gets(nombre[i]) works still gets jumped...

any ideas?

this full code (not long):

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #include <ctype.h>  #define max 100  char nombre[max][20]; char autor[max][20]; char edit[max][20]; char buscar[20]; char buscar_t[20]; char buscar_a[20];   int opcion,i,j,k,l;  void menu(void); void intro(void); void buscar_autor(void); void buscar_tit(void); void salir(void);  void main(void) {     printf("bienvenido al catalogo de libros. \n");     menu(); }     void menu(void) {     printf("\n catalogo de tarjetas:");     printf("\n 1. introducir");     printf("\n 2. buscar por autor");     printf("\n 3. buscar por titulo");     printf("\n 4. salir");      printf("\n elija opcion:");     scanf("%d", &opcion);      switch (opcion) {         case 1:             intro();             break;         case 2:             buscar_autor();             break;         case 3:             buscar_tit();             break;         case 4:             salir();             break;      }   }  void intro(void) {         (i=0; i<max; i++)          {             printf("introduzca el nombre del libro:");             gets(nombre[i]);              if (!strcmp(nombre[i],"salir"))              {                 break;             }              printf("introduzca el autor del libro:");             gets(autor[i]);             printf("introduzca la editorial del libro:");             gets(edit[i]);         }      menu();  }  void buscar_tit(void) {     printf("introduzca el titulo del libro que quiera buscar:");     gets(buscar_t);      (j=0; j<max+1; j++)      {         if (!strcmp(nombre[j],buscar_t))          {             printf("el libro se ha encontrado, el titulo es %s. ", nombre[j]);             break;         }         if (j=max)          {             printf("el libro no se ha encontrado.");             break;         }      }  }  void buscar_autor(void) {     printf("introduzca el autor del libro que quiera buscar:");     gets(buscar_a);      (k=0; k<max+1; k++)      {         if (!strcmp(autor[k],buscar_a))          {             printf("el libro se ha encontrado, el titulo es %s. ", nombre[k]);             break;         }         if (k=max)          {             printf("el autor no se ha encontrado.");             break;         }     } }  void salir(void) {     printf("muchisimas gracias por usar el catalogo de libros. \n"); } 

hope can me figure out error.

thanks guys.

please avoid using gets. use fgets specifying stdin stream.

 char *fgets(char *s, int size, file *stream); 

in code modify function:

void intro(void) {         getchar(); //added avoid escaping @ stage of loop         (i=0; i<max; i++)         {             printf("introduzca el nombre del libro %d : ",i+1); //modified statement know iteration going on printing loop counter value             fgets(nombre[i],sizeof(nombre[i]),stdin); //  replaced  gets(nombre[i]);              if (!strcmp(nombre[i],"salir"))             {                 break;             }              printf("introduzca el autor del libro: %d : ",i+1);             gets(autor[i]);  //here use fgets             printf("introduzca la editorial del libro %d : ",i+1);             gets(edit[i]);   //here use fgets          }      menu();  } 

small suggestion:

to make debugging easy, change #define max 100 #define max 5

see safe alternative gets

in case if issue repeats fgets add getchar();
before fgets , see how clear input buffer after fgets overflow?

from man pages of gets

bugs never use gets(). because impossible tell without knowing data in advance how many characters gets() read, , because gets() conĂ¢ tinue store characters past end of buffer, extremely dangerous use. has been used break computer security. use fgets() instead.


Comments

Popular posts from this blog

Unable to remove the www from url on https using .htaccess -