在接收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);  

这就解决了上述问题

晚辈还请各位前辈高人指点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sf9090

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值