C 调用sprintf函数

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_

我在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_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()
覆盖它?顺便说一句,不要创建这样的查询字符串。想想当我说我的学校名字是“代码>罗伯茨”时会发生什么;投递台学校--