修改以下代码,并解释改正的原因:#define _CRT_SECURE_NO_WARNINGS #pragma warning(disable:6031) #include <stdio.h> #include <stdlib.h> #include <mysql.h> #include <string.h> #define N 3 MYSQL* conn; MYSQL m; void initialize() { // 初始化链接 conn = mysql_init(NULL); mysql_options(&m, MYSQL_SET_CHARSET_NAME, "gbk"); // 连接数据库 if (!mysql_real_connect(conn, "localhost", "b", "12345", "tang", 0, NULL, 0)) { printf("连接数据库失败: %s\n", mysql_error(conn)); exit(1); } else printf("数据库连接成功!\n"); } //录入学生信息 void Insert(MYSQL* mysql) { int i = 0; char* str1 = "insert into student(id,name,chengji) values("; char sql_insert[200]; for (i = 1; i <= N; i++) { char id[12], name[9]; char chengji=0; printf("请输入学生学号:"); gets_s(id, 12); printf("请输入学生姓名:"); gets_s(name, 9); printf("请输入学生成绩:"); gets_s(chengji, 9); int n = getchar(); sprintf(sql_insert," %s'%s', %5s", str1, id, name, chengji); mysql_query(mysql, sql_insert); printf("录入信息成功!\n"); } return; } // 显示学生信息 void Display(MYSQL* mysql) { char* str = "select from student"; MYSQL_RES* res; //一个结果集结构体 MYSQL_ROW row = NULL; //char**二维数组,存放一条条记录(一条记录代表一个学生的信息) char id[12], name[9]; char chengji; //向HySQL发送SQL语句 mysql_query(mysql, str); //获取结果集 res = mysql_store_result(mysql); //打印 printf("id\t name\t chengji\t"); while (row = mysql_fetch_row(res)) { for (int i = 0; i < mysql_num_fields(res); i++) { switch (i) { case 0: { strcpy(id, row[i]); break; } case 1: { strcpy(name, row[i]); break; } case 2: { strcpy(chengji, row[i]); break; } break; } } } printf("10s\t, %11s\t,%4s\n", id, name,chengji); nysql_free_result(res); } void finalize(){ // 关闭连接 mysql_close(conn); printf("已关闭数据库"); } int main() { initialize(); insert(); finalize(); return 0; }
时间: 2024-01-14 16:02:50 浏览: 113
下面是修改后的代码,同时也会解释改正的原因:
```c
#define _CRT_SECURE_NO_WARNINGS
#pragma warning(disable:6031)
#include <stdio.h>
#include <stdlib.h>
#include <mysql.h>
#include <string.h>
#define N 3
MYSQL* conn;
MYSQL m;
void initialize() {
// 初始化链接
conn = mysql_init(NULL);
mysql_options(conn, MYSQL_SET_CHARSET_NAME, "gbk");
// 连接数据库
if (!mysql_real_connect(conn, "localhost", "b", "12345", "tang", 0, NULL, 0)) {
printf("连接数据库失败: %s\n", mysql_error(conn));
exit(1);
}
else printf("数据库连接成功!\n");
}
//录入学生信息
void Insert(MYSQL* mysql) {
int i = 0;
char* str1 = "insert into student(id,name,chengji) values(";
char sql_insert[200];
for (i = 1; i <= N; i++) {
char id[12], name[9];
char chengji[9];
printf("请输入学生学号:");
fgets(id, 12, stdin);
printf("请输入学生姓名:");
fgets(name, 9, stdin);
printf("请输入学生成绩:");
fgets(chengji, 9, stdin);
int n = getchar();
sprintf(sql_insert, " %s'%s', '%s', '%s')", str1, id, name, chengji);
mysql_query(mysql, sql_insert);
printf("录入信息成功!\n");
}
return;
}
// 显示学生信息
void Display(MYSQL* mysql) {
char* str = "select * from student";
MYSQL_RES* res; //一个结果集结构体
MYSQL_ROW row = NULL; //char**二维数组,存放一条条记录(一条记录代表一个学生的信息)
char id[12], name[9];
char chengji[9];
//向MySQL发送SQL语句
mysql_query(mysql, str);
//获取结果集
res = mysql_store_result(mysql);
//打印
printf("id\t name\t chengji\t\n");
while (row = mysql_fetch_row(res)) {
for (int i = 0; i < mysql_num_fields(res); i++) {
switch (i) {
case 0: {
strcpy(id, row[i]);
break;
}
case 1: {
strcpy(name, row[i]);
break;
}
case 2: {
strcpy(chengji, row[i]);
break;
}
}
}
printf("%s\t %s\t %s\t\n", id, name, chengji);
}
mysql_free_result(res);
}
void finalize() {
// 关闭连接
mysql_close(conn);
printf("已关闭数据库");
}
int main() {
initialize();
Insert(conn);
Display(conn);
finalize();
return 0;
}
```
改正的原因如下:
1. `MYSQL* conn; MYSQL m;` 这一行代码中,`MYSQL m;`是不需要的,因为我们只需要一个`MYSQL*`类型的指针即可。
2. `mysql_options(&m, MYSQL_SET_CHARSET_NAME, "gbk");` 中的`&m`应该改为`conn`,因为我们要设置的是`conn`这个MySQL连接的属性,而不是`m`这个无用的变量。
3. `gets_s`函数不是标准C函数,且存在安全问题,所以应该使用更安全的`fgets`函数。同时,`chengji`应该是一个字符串类型,而不是字符类型。
4. `mysql_query`函数执行的SQL语句中,缺少了一个右括号`)`,导致语法错误。
5. `Display`函数中的SQL语句缺少了`*`,导致无法获取到所有的学生信息。
6. `Display`函数中打印学生信息的语句格式不正确,应该为`"%s\t %s\t %s\t\n"`。
7. `mysql_free_result`函数的名称拼写错误,应该为`mysql_free_result`。
阅读全文