学c语言有一阵子了。想测试一下技能。
正好单位组织安全人员考试,2300多道题,我晕,何不借此机会写一个考试机?说来就来
准备
语言 c语言
数据库 sqlite
要求
显示题目 显示选项 答错将该题放入错题库。单选30,多选20,判断30 ,随机出题
sqlite第一次用。学一学吧,用的sql语言,应该没啥大问题
我以为没有多大问题,结果问题大大的大大的。
dos命令下操作sqlite没啥大问题,用c来连接,可真是费劲了。当然你要是明白了,也就不费劲了,要是你跟我一样第一次用,好吧,费劲吧。
一开始,我以为要将sqlite.c文件等复制到工程中就可以用,结果。。。。。全是错误,而且这些错误还是莫名其妙的。。。。无语。
后来百度到了一篇有用的文章。。。花了我两天时间找到了这篇文章解决了问题。。。。(转载地址 https://www.iteye.com/blog/972169909-qq-com-1677691)
到http://www.sqlite.org/download.html下载:
解压后得到sqlite3.h,得到的其他文件这里不会用到
下载第二个,解压后得到sqlite3.dll和sqlite3.def
下面要做的是:利用sqlite3.def生成sqlite3.lib
①把sqlite3.def放到VC6的LIB.exe所在目录,例如我的VC是装在G盘的:G:Microsoft Visual StudioVC98Bin
②开始菜单->运行->cmd,打开cmd命令行
(以下括号里的黑色字体是输入的内容)
③输入(g:)然后回车切换到g盘目录(因为我VC装在g盘)
④输入(cd Microsoft Visual StudioVC98Bin)然后回车切换到LIB.exe所在目录
⑤输入命令(LIB /MACHINE:IX86 /DEF:sqlite3.def)然后回车,在同一目录下就会生成了sqlite3.lib文件了,当然还生成了sqlite3.exp,不过这里没用到
(如果提示丢失mspd60.dll,请到Microsoft Visual StudioCommonMSDev98Bin目录找到mspd60.dll,然后再把它复制到Microsoft Visual StudioVC98Bin目录)
参考截图:
⑥用VC6新建一个空的控制台工程,把(sqlite3.h、sqlite3.dll、sqlite3.lib)放到工程文件夹里,
选择菜单栏的工程-->设置:在连接的(对象/库模块)后面加上sqlite3.lib,然后点确定
通过上述,解决了问题,不报错了。但是总是提示一个问题就是 应用程序无法正常启动 搞了老半天,明明程序没问题,为什么老是无法启动呢?然后百度了一下,有位同志别的程序也出现了问题,他说是dll的版本跟系统版本不一致导致的。。。。
不可能啊,我系统64位,我在sqlite官网下的也是64位的,为啥会有问题呢?
难道是我下错了?好吧,全删了,再重新下载,然后又重新生成了一遍,结果老样子。。。。难道是让我用32位?我系统是64的啊。。。苍天啊,试一下吧,下载了32位的dll,然后生成一个32位lib,好吧,成功了,成功了,这是什么鬼。。。见鬼了啊。
。再找找原因,难道是我的vc的编译版本的问题?结果找到了
,看到了么?32位。。然后去百度了一下vc6是否支持64.。。好吧,原始版本只支持32位系统。。。。我服了,要学的东西好多啊。。。
现在基本的判断题功能已经实现,还有单选和多选,所以想单独拿出来做方法,这样代码看起来更调理,可是。。。不幸的事情发生了
![](https://img2018.cnblogs.com/blog/70762/201909/70762-20190909091845122-904579720.png)
无奈之际,自己试错,是需要在程序头部加方法的定义。。。但是我以前的方法都没有加定义运行没问题,为什么单独拿出来就有问题呢?这个问题以后再仔细研究,先把程序写完
char *p = " hello world "; 和 char p[ ] = " hello world ! ";
所有的字符串常量存放在静态存储区。【字符串常量是贯穿整个程序的生命周期的】,所以1,2只是是否能够访问到的问题,
1. 字符串常量的地址赋值给指针常量,改指针常量指向的字符串的字符不允许修改。不同的字符串指针指向同一个字符串时候,所有的指针指向同一个地址。
2. 将字符串的每个字符赋值给数组,该指针指向数组的首地址,
在 char p [ ] = "heloo "; 中, ” hello “ 是一个字符串常量,存放在静态数据区,但是把一个字符串常量赋值给了一个局部变量(char p [ ] 型数组),该局部变量是存放在栈中的。这样子就有两块内容一样的内存,意思就是说 : char p [ ] = :hello : 这条语句让 ”hello“ 在内存中有两条拷贝,一份在动态分布的栈中,一份在静态存储区。而char *p = ''hello '' 第二个是指向静态存储区的指针,此变量指向的内存在程序运行中不会被清空。
作者:少年英雄房飞冯
链接:https://www.jianshu.com/p/b5c49b747fbf
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
#include <stdio.h> #include <stdlib.h> #include "sqlite3.h" #include "strParse.h" #define DB_NAME "anquanc.db" #define DANXUAN_NAME "aaa.csv" #define DUOXUAN_NAME "bbb.csv" #define PANDUANXUAN_NAME "ccc.csv" void printPanduan(char *ta,char *id,char *type); void panduanTi(FILE *fp,char *p); void danxuanTi(FILE *fp,char *p); void duoxuanTi(FILE *fp,char *p); void printPanduan(char *ta); sqlite3 *conn = NULL; char *err_msg = NULL; char *sqlT; char sql[2000] = ""; /*bool skip(){ scanf("%*[A-E]"); return true; }*/ int sqlite3_exec_callback (void *data, int nColumn, char **colValues, char **colNames) { int i; char *answerA; char *answerB; char *answerC; char *answerD; char *answerE; char *trueAnswer; char *type; char *id; // printf("%d ",nColumn); for ( i = 0; i < nColumn; i++) { switch(i) { case 0: id=colValues[i]; // printf("id:%s ",colValues[i]); break; case 1: printf ("%s ", colValues[i]); break; case 2: answerA=colValues[i]; break; case 3: answerB=colValues[i]; break; case 4: answerC=colValues[i]; break; case 5: answerD=colValues[i]; break; case 6: answerE=colValues[i]; break; case 7: trueAnswer=colValues[i]; break; case 8: type=colValues[i]; break; default: //type=colValues[i]; //printf("%s",type); break; } } if(strcmp(type,"1")==0) { printf ("%s ", colValues[2]); printf ("%s ", colValues[3]); printf ("%s ", colValues[4]); printf ("%s ", colValues[5]); printPanduan(trueAnswer,id,type); } if(strcmp(type,"2")==0) { printf ("%s ", colValues[2]); printf ("%s ", colValues[3]); printf ("%s ", colValues[4]); printf ("%s ", colValues[5]); printf ("%s ", colValues[6]); printPanduan(trueAnswer,id,type); } if(strcmp(type,"3")==0) { printPanduan(trueAnswer,id,type); } printf (" "); return 0; } void panduanTi(FILE *fp,char *p) { char text[2400][400]; char *ques; char *ans; char *pd="o"; char Aanswer='A'; char Banswer='B'; char Canswer='C'; char Danswer='D'; int i=0; int j=0; while(fp!=NULL && i<2000 && !feof(fp)) { fscanf(fp,"%s",&text[i]); if(strstr(text[i],p)) { // printf("baohan "); i++; } else { if(i!=0 && !strstr(text[i-1],p)) strcat(text[i-1], text[i]); else i++; // printf("bubaohan "); } if(feof(fp)) { //printf("wenjianjieshu"); strcat(text[i], pd); } // fscanf(fp,"%s",text1); // fseek(fp,2L,SEEK_CUR); // printf("%d ",i); } for(j=0;j<i;j++) { if(!strstr(text[j],p)) { ques=text[j]; ans=text[j+1]; // printf("11111%s ",text[i]); } // printf("%s",ques); sprintf (sql, "INSERT INTO test (question, trueAnswer, questionType) VALUES ('%s', '%s', %c)", ques, ans, '3'); if (sqlite3_exec (conn, sql, NULL, NULL, &err_msg) != SQLITE_OK) { printf ("操作失败,错误代码:%s ", err_msg); exit(-1); } j++; // printf("%s ",text[i]); // printf("%d ",i); } } void printPanduan(char *ta,char *id,char *type) { char str,ctr[5],*actr; if(strchr(type,'1')) { do{ printf("单选题:请输入答案,以回车结束 "); scanf("%c", &str); str=toUper(str); while(getchar() != ' '); } while(str<'A'||str>'D' || str =='0'); if(strchr(ta,str)) { printf("回答正确 "); sprintf (sql, "update test set AnswerRight=1 where id=%s",id); if (sqlite3_exec (conn, sql, NULL, NULL, &err_msg) != SQLITE_OK) { // printf(sql); printf ("操作失败,错误代码:%s ", err_msg); exit(-1); } } else { printf("回答错误 "); } } else if(strchr(type,'2')) { printf("多选题:请输入答案 以回车结束 "); while (scanf("%[A-E]%[A-E]%[A-E]%[A-E]%[A-E]", &ctr) != 1) { while(getchar() != ' '); printf("输入错误,请输入A,B,C,D,E "); } // scanf("%[A-E],%[A-E],%[A-E],%[A-E],%[A-E]",&ctr); //不是A-Z就结束 if(getEnglish(ta,ctr)==0) { printf("回答正确 "); sprintf (sql, "update test set AnswerRight=1 where id=%s",id); if (sqlite3_exec (conn, sql, NULL, NULL, &err_msg) != SQLITE_OK) { //printf(sql); printf ("操作失败,错误代码:%s ", err_msg); exit(-1); } } else { printf("回答错误 "); } } else { do{ printf("判断题:请输入答案 正确输入A错误输入B,以回车结束 "); scanf("%c", &str); str=toUper(str); while(getchar() != ' '); } while(str!='a' &&str!='b'&&str!='A' &&str!='B'); if(strchr(ta,str)) { printf("回答正确 "); sprintf (sql, "update test set AnswerRight=1 where id=%s",id); if (sqlite3_exec (conn, sql, NULL, NULL, &err_msg) != SQLITE_OK) { //printf(sql); printf ("操作失败,错误代码:%s ", err_msg); exit(-1); } } else { printf("回答错误 "); } } // printf(strchr(trueAnswer,str)); } //读取excel写入数据库 void getExcel(char fileName[10]) { // char *p="正确答案"; // system("chcp 65001"); FILE *filepipe=fopen(fileName,"r"); fseek(filepipe,0L,SEEK_SET); // Panduan(filepipe); if(strstr(fileName,DANXUAN_NAME)) { danxuanTi(filepipe,p); } else if(strstr(fileName,DUOXUAN_NAME)) { duoxuanTi(filepipe,p); } else { panduanTi(filepipe,p); } // printf("%s",text1); } char* intArrayPriseStr(int array[100]) { int i; char str[1000]={'