C 调用sprintf函数
我在R中使用MySQL查询在数据库中插入数据,另外还使用字符串变量将数据插入数据库 我得到这个错误: 格式不是字符串文字,也没有格式参数[C 调用sprintf函数,c,printf,C,Printf,我在R中使用MySQL查询在数据库中插入数据,另外还使用字符串变量将数据插入数据库 我得到这个错误: 格式不是字符串文字,也没有格式参数[-Wformat security] 这是密码 void add_data_to_the_table(MYSQL * connection){ char schlName[200]={}; printf("Enter the school name \n"); scanf("%s",schlName); char query_
-Wformat security
]
这是密码
void add_data_to_the_table(MYSQL * connection){
char schlName[200]={};
printf("Enter the school name \n");
scanf("%s",schlName);
char query_string[] = { "INSERT INTO schools(schoolName) VALUES(%s)" };
sprintf(schlName, query_string);
if (mysql_query(connection,buf))
{
validate(connection);
}
}
我本来希望将字符串插入数据库中的表
,但是我得到了上面的错误。对于初学者来说,这是数组的初始化
char schlName[200]={};
在C中不正确。大括号中的初始值设定项列表不能为空。改写
char schlName[200]={ '\0' };
在sprintf调用中,参数的顺序无效。看来你是说
sprintf( result_string, query_string, schlName );
而不是
sprintf( schlName, query_string);
其中result_string是将重定向输出的字符串
函数sprintf
的声明如下所示
int sprintf(char * restrict s, const char * restrict format, ...);
因此,如果与参数格式相对应的参数具有类似于%s
的转换说明符,则至少需要提供三个参数
注意这个电话
scanf("%s",schlName);
这是不安全的。首先使用
fgets
而不是scanf
初始化数组
char schlName[200]={};
在C中不正确。大括号中的初始值设定项列表不能为空。改写
char schlName[200]={ '\0' };
在sprintf调用中,参数的顺序无效。看来你是说
sprintf( result_string, query_string, schlName );
而不是
sprintf( schlName, query_string);
其中result_string是将重定向输出的字符串
函数sprintf
的声明如下所示
int sprintf(char * restrict s, const char * restrict format, ...);
因此,如果与参数格式相对应的参数具有类似于%s
的转换说明符,则至少需要提供三个参数
注意这个电话
scanf("%s",schlName);
这是不安全的。使用
fgets
而不是scanf
想象一下当您的查询字符串中有一个百分号时会发生什么。sprintf()
的对应参数在哪里?为什么要用scanf()
调用填充schlName
(顺便说一句,您确实需要检查它的返回值以确保它有效),然后立即用sprintf()
覆盖它?顺便说一句,不要创建这样的查询字符串。想想当我说我的学校名字是“代码>罗伯茨”时会发生什么;DROP TABLE schools--
想象一下当您的查询字符串中有一个百分号时会发生什么。sprintf()
的对应参数在哪里?为什么要用scanf()
调用填充schlName
(顺便说一句,您确实需要检查它的返回值以确保它有效),然后立即用sprintf()
覆盖它?顺便说一句,不要创建这样的查询字符串。想想当我说我的学校名字是“代码>罗伯茨”时会发生什么;投递台学校--