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);
这就解决了上述问题