c - Segmentation fault (core dumped) when parsing char data -


i need help. have program read gps , accelerometer data port. programm work : when send 'a' prog receive gps data , send database, when send 'b', prog send accelerometer data , save database too. when runn proggram, gps data success received , send databse accelerometer data canot receive , error "segmentation fault. me resolve prblem..?

int main(void) {      int fd;     fd = open("/dev/ttyacm0", o_rdwr | o_noctty | o_ndelay);     if (fd == -1) {         perror("open_port: unable open port ");     } else {         fcntl(fd, f_setfl, 0);     }      char a[] = "a";     char b[] = "b";      int n,m,cnt;     char in[30];     //char in2[50];     //char *in;     //char in2[100];     //in = (char*) malloc(i+1);     //if (in == null) exit(1);       mysql *conn;      const char *localhost   = "127.0.0.1";     const char *user     = "root";     const char *password = "";     const char *database = "arduino1";      conn = mysql_init(null);      // connect database      if (!mysql_real_connect(conn, localhost, user, password, database, 0, null, 0))     {           fprintf(stderr, "%s\n", mysql_error(conn));           exit(1);     }        for(cnt=0; cnt<5; cnt++)      {         if (cnt < 1) {             sleep(2);             n = write(fd, a, sizeof(a));             printf("send : %s \n", a);              //terima data gps dari port             sleep(1);             n = read(fd, in, 100);             if (n < 0)             {                 perror("read");                 break;             }              //query gps                      char c_lat[50],c_lon[50];             tokenizer(in,c_lat,c_lon);               //isi nilai gps ke database              char query[255];              strcat(query,"insert gps (latitude, longitude) values (");                 strcat(query,c_lat);                 strcat(query,",");                 strcat(query,c_lon);                 strcat(query,")");              if (mysql_query(conn, query));             {               printf("%s\n", query);             }        } else {             m = write(fd, b, sizeof(b));             printf("send : %s \n", b);              //terima data accelerometer dari port             sleep(1);             m = read(fd, in, 100);              in[m] = '\0';                 char str[255];              //query accelerometer                char c_nilai_x[10],c_nilai_y[10],c_nilai_z[10],c_teg[6];             tokenizer_acm(in,c_nilai_x,c_nilai_y,c_nilai_z,c_teg);               //isi nilai accelerometer ke database                strcat(str,"insert highcharts_php (x_axis, y_axis, z_axis, tegangan) values (");                 strcat(str,c_nilai_x);                 strcat(str,",");                 strcat(str,c_nilai_y);                 strcat(str,",");                 strcat(str,c_nilai_z);                 strcat(str,",");                 strcat(str,c_teg);                 strcat(str,")");              if (mysql_query(conn, str));             {               printf("%s\n", str);             }          }           // close database connection         mysql_close(conn);      }      return 0; } 

thank help. still received same error. change likr : int main(void) {

int fd; fd = open("/dev/ttyacm0", o_rdwr | o_noctty | o_ndelay); if (fd == -1) {     perror("open_port: unable open port "); } else {     fcntl(fd, f_setfl, 0); }  char a[] = "a"; char b[] = "b";  int n,m,cnt; char in[50];  mysql *conn;  const char *localhost   = "127.0.0.1"; const char *user     = "root"; const char *password = ""; const char *database = "arduino1";  conn = mysql_init(null);  // connect database  if (!mysql_real_connect(conn, localhost, user, password, database, 0, null, 0)) {       fprintf(stderr, "%s\n", mysql_error(conn));       exit(1); }    for(cnt=0; cnt<5; cnt++)  {     if (cnt < 1) {         sleep(2);         n = write(fd, a, sizeof(a));         printf("send : %s \n", a);          //terima data gps dari port         sleep(1);         n = read(fd, in, 20);         if (n < 0)         {             perror("read");             break;         }          //query gps                  char c_lat[10],c_lon[9];         tokenizer(in,c_lat,c_lon);           //isi nilai gps ke database          char query[255] = "insert gps (latitude, longitude) values (";             strcat(query,c_lat);             strcat(query,",");             strcat(query,c_lon);             strcat(query,")");          if (mysql_query(conn, query));         {           printf("%s\n", query);         }    } else {         m = write(fd, b, sizeof(b));         printf("send : %s \n", b);          //terima data accelerometer dari port         sleep(1);         m = read(fd, in, 30);          in[m] = '\0';               //query accelerometer            char c_nilai_x[8],c_nilai_y[8],c_nilai_z[8],c_teg[4];         tokenizer_acm(in,c_nilai_x,c_nilai_y,c_nilai_z,c_teg);           //isi nilai accelerometer ke database           char str[255] = "insert highcharts_php (x_axis, y_axis, z_axis, tegangan) values (";             strcat(str,c_nilai_x);             strcat(str,",");             strcat(str,c_nilai_y);             strcat(str,",");             strcat(str,c_nilai_z);             strcat(str,",");             strcat(str,c_teg);             strcat(str,")");          if (mysql_query(conn, str));         {           printf("%s\n", str);         }      }       // close database connection     mysql_close(conn);  }  return 0; 

}

and result when runn program :

send : insert gps (latitude, longitude) values (-6.889760,107.619659) send : b segmentation fault (core dumped)

i need help.... thank you

this error:

char query[255]; strcat(query,"insert gps (latitude, longitude) values ("); 

as strcat() requires destination buffer null terminated on entry, , uninitialized. means strcat() search through query null character , knows find one, possibly beyond bounds of query result in strcat() writing memory should not be. change to:

char query[255] = "insert gps (latitude, longitude) values ("; 

same error str later in code.

instead of using multiple strcat() calls use safer snprintf():

char query[255]; int result = snprintf(query,                       255,                       "insert gps (latitude, longitude) values (%s,%s)",                       c_lat,                       c_lon);  /* see following paragraph explanation of condition. */ if (result > 0 && result < 255) { } 

snprintf() return value (from section 7.19.6.5 snprintf function of c99 standard):

the snprintf function returns number of characters have been written had n been sufficiently large, not counting terminating null character, or negative value if encoding error occurred. thus, null- terminated output has been written if , if returned value nonnegative , less n.


Comments

Popular posts from this blog

blackberry 10 - how to add multiple markers on the google map just by url? -

php - guestbook returning database data to flash -

delphi - Dynamic file type icon -