sprintf()
sprintf指的是***字符串格式化***命令,主要功能是把格式化的數據寫入某個字符串中。sprintf 是個***變參函數***。使用sprintf 對於寫入***buffer的字符數是沒有限制的***,這就存在了buffer溢出的可能性。解決這個問題,可以考慮使用 snprintf函數,該函數可對寫入字符數做出限制。詳解見sprintf()百度詳解。
而我在這裏主要說一下我做學生管理系統使用它訪問數據庫sqlite3中數據時出現的問題
1.char *s = NULL;
然後sprintf到s就會出錯。原因:sprintf是要訪問內存的,null就無法訪問,直接肯定就出錯了。
2.
數組空間是可寫的
malloc出來的空間也是可寫的
3.錯誤使用
const char *str = gtk_entry_get_text(entry1); //帳號
const char *str1 = gtk_entry_get_text(entry2); //密碼
......
sprintf(sql2, "select zhanghao from xin where zhanghao ='%s';", str);
報錯
原因:gtk entry get text(GUI的文本控件)返回的字符串是禁止修改的,sprintf會修改第一個參數指向的內存區域,所以不能用sprintf()
解決辦法:(1).在中間定義一個變量
const char *str = gtk_entry_get_text(GTK_ENTRY(entry1)); //帳號
const char *str1 = gtk_entry_get_text(GTK_ENTRY(entry2)); //密碼
//int b = strlen(str);
char c[50],d[50];
for ( i = 0; str[i] != '\0'; i++)
*(c+i) = *(str+i);
i[c] = '\0';
for ( i = 0; str1[i] != '\0'; i++)
*(d+i) = *(str1+i);
i[d] = '\0';
printf("%s\n", str);
....... char *sql2 = malloc(100);//sql2需要提前賦值,不然指針是亂指的也可以改成char sql2[100];
strcpy(sql2, c);
sprintf(sql2, "select zhanghao from xin where zhanghao ='%s';", c); ;
(2)
const char *str = gtk_entry_get_text(GTK_ENTRY(entry1)); //帳號
char *sql2=NULL;
sql2 = (char *)malloc(100 * sizeof(char));
sprintf(sql2,"select zhanghao from xin where zhanghao ='%s';",str);
這就解決了上述問題