在接收GUI控件文本信息去訪問數據庫時出項的sprintf()的錯誤

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

報錯
sprintf()應用錯誤
原因: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);  

這就解決了上述問題

晚輩還請各位前輩高人指點

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章