1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<mysql.h>
4 #include<string.h>
5 24 int main(){
25 char* DBName = "judge";
26 MYSQL *conn_ptr; 28 conn_ptr = mysql_init(NULL);
29 conn_ptr = mysql_real_connect(conn_ptr,"localhost","root","hjhlovehf",DBName,0,NULL,0);
30
31 MYSQL_RES* res_answer;//保存从answer表中得到的数据
32 MYSQL_RES* res_user_answer;//保存从user_answer_order_prim表中得到的数据
33
34 int res;
35
36 char *selectUA = "select id,user_id,user_name,answer,status from user_answer_order_prim";
37 char *selectA = "select answer from answer1";
38 char insertUAP[128];//往user_answer_precision表中插入结果 如果声明为指针将出错
39
40 res = mysql_query(conn_ptr,selectUA);
41 if(res){
42 fprintf(stderr,"select from user_answer_order_prim error:%s\n",mysql_error(conn_ptr));
43 exit(EXIT_FAILURE);
44 }
45 else{
46 res_user_answer = mysql_store_result(conn_ptr);
47 printf("select %lu rows from user_answer_order_prim\n",(unsigned long)mysql_num_rows(res_user_answer));
48 }
49
50 MYSQL_ROW row_answer;
51 MYSQL_ROW row_user_answer;
52
53 int flag = 1;
54 row_user_answer = mysql_fetch_row(res_user_answer);
55 int count = 0;//代表人数
56 int hundred = 0;//每个人100条记录
57 int ten = 0;//每个人的100天记录分成10份
58 char* user_name;
59 char* user_id;
60 double precision[10];
61
62 while(count<76){
63
64 res = mysql_query(conn_ptr,selectA);
65 if(res){
66 fprintf(stderr,"select from answer error:%s\n",mysql_error(conn_ptr));
67 exit(EXIT_FAILURE);
68 }
69 else{
70 res_answer=mysql_store_result(conn_ptr);
71 printf("select %lu rows from answer\n",(unsigned long)mysql_num_rows(res_answer));
72 }
73 while(flag && hundred<100){
74
75 if(hundred == 0){
76 user_id = row_user_answer[1]; 78 user_name = row_user_answer[2];
79 }
80 double right = 0;
81 while(ten<10){
82 if(!(row_answer=mysql_fetch_row(res_answer))){ 84 break;
85 }
89 if(!strcmp(row_user_answer[3],row_answer[0])){
90 right++;
91 }
92 if(!(row_user_answer = mysql_fetch_row(res_user_answer))){
93 flag = 0;
94 break;
95 }
96 ten++;
97 hundred++;
98 }
99 precision[(hundred-1)/10] = right/10;
100 ten =0;
101 }103 count++;
104 hundred=0;
105 sprintf(insertUAP,"insert into user_answer_precision(user_id,user_name,one,two,three,four,five,six,seven,eight,nine,ten) values('%s','%s',%f,%f,%f,%f,%f,%f,%f,%f,%f,%f)",user_id ,user_name,precision[0],precision[1],precision[2],precision[3],precision[4],precision[5],precision[6],precision[7],precision[8],precision[9]);
106 printf("%s\n",insertUAP);
107 //mysql_data_seek(res_answer,0);//重置answer表结果集到第一行
108 mysql_free_result(res_answer);//编译通过,运行是提示Segmentation fault
109 res = mysql_query(conn_ptr,insertUAP);
110 if(res){
111 fprintf(stderr,"insert into user_answer_precision error:%s\n",mysql_error(conn_ptr));
112 }
113 int i;
114 for(i = 0;i<10;i++){
115 precision[i]=0;
116 }
117 }
118
119
120 mysql_free_result(res_user_answer);
121 mysql_close(conn_ptr);123 exit(EXIT_SUCCESS);
124
以上程序编译通过,运行时出现Segmentation fault错误,一直没找到原因,本人对mysql c api不是很熟悉
调试时108行提示一下错误:
Program received signal SIGSEGV, Segmentation fault.
0x00641b81 in mysql_free_result () from /usr/lib/mysql/libmysqlclient.so.15有人碰到过这种情况吗?有的话麻烦告知,还有就是运用mysql c api的时候有什么需要特别注意的?最后想问一下关于mysql中统一中文编码问题,能不能给个详细的设置步骤。谢谢!
2.你的报错,是取结果有错了,是好事,最起码连上了。