关于使用realloc函数的问题

小弟今天写了一个函数,目的很简单:
把输入的指针里面的内容重新排序后去掉后面perc%个数。
可是在使用realloc的时候一直提示我“windows在.exe中触发了一个断点“,不知道是不是访问越界了,小弟愚笨,调试了两个小时都没有调好,特向各位请教,不知道我这么写有没有什么问题。

 void maxdt(double *input, int size, double perc)
{
    sort(input, size);
    input=(double*)realloc(input,sizeof(double)*(int)(size-size*perc/100));
}

2个回答

input指向新的地址,这个没用,实参的指针不会被修改的。
需要用
void maxdt(double **input, int size, double perc)
{
sort(*input, size);
input=(double)realloc(input,sizeof(double)*(int)(size+size*perc/100));
}
调用者加上取地址符号。

u010718778
-不过而已 非常感谢您的回答,不过我的问题貌似不是这样的,我想请问一下,realloc函数一定要在前面搭配malloc函数使用吗?我是用别的方法给指针分配的地址能不能用realloc改变其大小
4 年多之前 回复

malloc用于申请一段新的地址,参数size为需要内存空间的长度,如:
char* p;
p=(char*)malloc(20);

calloc与malloc相似,参数sizeOfElement为申请地址的单位元素长度,numElements为元素个数,如:
char* p;
p=(char*)calloc(20,sizeof(char));
这个例子与上一个效果相同

realloc是给一个已经分配了地址的指针重新分配空间,参数ptr为原有的空间地址,newsize是重新申请的地址长度
如:
char* p;
p=(char*)malloc(sizeof(char)*20);
p=(char*)realloc(p,sizeof(char)*40);

Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
c语言重新分配内存函数

realloc函数返回的指针是不是和改变大小前的指针的起始地址是一样的,只是结束地址因为大小改变了而不一样? 图中书上划线的地方(指向新地址)说的有问题吗? 我在以下程序中输出fDouble和iInt的值验证是一样的啊 ``` #include<stdio.h> #include <stdlib.h> int main() { double *fDouble; /*定义实型指针*/ float* iInt; /*定义整型指针*/ fDouble=(double*)malloc(sizeof(double)); /*使用malloc函数分配实型空间*/ printf("%d\n",fDouble); printf("%d\n",sizeof(*fDouble)); /*输出空间的大小*/ iInt=(float *)realloc(fDouble,sizeof(float)); /*使用realloc改变分配空间大小*/ printf("%d\n",iInt); printf("%d\n",sizeof(*iInt)); return 0; } ![![图片说明](https://img-ask.csdn.net/upload/201708/04/1501831647_646579.jpg)图片说明](https://img-ask.csdn.net/upload/201708/04/1501831333_593962.png) ``` ![图片说明](https://img-ask.csdn.net/upload/201708/04/1501839652_491405.jpg) ![图片说明](https://img-ask.csdn.net/upload/201708/04/1501839670_360103.png)

关于realloc()使用的问题

``` #include<stdio.h> #include<string.h> #include<stdlib.h> typedef struct HString { char *ch=NULL; //需要初始化 int length=0; }HString; void hsAssign(HString &T,char s[]) { if (T.ch) free(T.ch); T.ch = (char*)malloc(sizeof(char)); if (!T.ch) { printf("Fail to create the string."); return; } T.length = strlen(s); for (int i = 0; i < strlen(s); i++) T.ch[i] = s[i]; } int hsCompare(HString T, HString S) { //若S>T,则返回值>0 for (int i = 0; i < T.length&&i < S.length; i++) if (T.ch[i] != S.ch[i]) return S.ch[i] - T.ch[i]; //返回的是ASCII码的差 return S.length - T.length; } int hsClear(HString &T) { free(T.ch); T.ch = NULL; T.length = 0; return 1;//确认清空串操作是否成功 } void hsConcat(HString &con, HString T, HString S) { if (con.ch) free(con.ch); con.ch = (char*)malloc(sizeof(char));//确保con被分配了新的存储空间 for (int i = 0; i < T.length; i++) con.ch[i] = T.ch[i]; for (int i = T.length; i < T.length + S.length; i++) con.ch[i] = S.ch[i - T.length]; con.length = T.length + S.length; } void hsSub(HString &sub, HString T, int pos, int len){ if (pos -1> T.length || pos <= 0 || pos + len -1> T.length || len < 0) { printf("Wrong input."); return; } int count = 0; if (sub.ch) free(sub.ch); sub.ch = (char*)malloc(sizeof(char)); for (int i = pos - 1; i <=pos + len - 2; i++) sub.ch[count++] = T.ch[i]; sub.length = len; } void hsInsert(HString &S, int pos, HString T) { int count = 0; if (pos <= 0 || pos - 1 > S.length) { printf("Wrong input"); return; } for (int i = S.length - 1; i >= pos - 1; i--) S.ch[i + T.length] = S.ch[i]; for (int i = pos - 1; i <= pos + T.length - 2; i++) S.ch[i] = T.ch[count++]; S.length += T.length; } void hsPrint(HString T) { for(int i=0;i<T.length;i++) printf("%c", T.ch[i]); } int main() { HString T, S1,S2; char s[20]; scanf_s("%s", s, 20); hsAssign(S1, s); scanf_s("%s", s, 20); hsAssign(S2, s); hsInsert(S1, 2, S2); hsPrint(S1); return 0; } ``` 在hsInsert()函数中如果使用了S.ch=(char*)realloc(S.ch,(T.length+S.length)*sizoef(char)); 结果是tTEST 而如果不用realloc()函数 结果是tTESTest 请问这是为什么?

C语言中指针释放问题,函数free()的使用。

各位大虾们,C语言中如果不是指向使用malloc,realloc、calloc动态申请的内存的指针,是不是就不需要free()释放该指针了呢? 比如说申请了一个指向结构体的指针, 或者是指向一个整型变量的指针。谢谢各位大虾。

内部排序的性能分析:函数调用的问题?在主函数中用一种方法排序后,排好序的顺序表被带回主函数,再用另一种方法排序等于没用了

原先用的void insertsort(Sqlist &L),改成void insertsort(Sqlist L)还是不行,形参不是传值调用主函数不会改变嚒? 已经测试排序的代码没有问题,单独使用一种方法没有问题,几种同时使用才会出问题, ![图片说明](https://img-ask.csdn.net/upload/201912/09/1575891779_129272.png) 第一行:随机生成的顺序表 第二行:Insert排序后的顺序表 第三行:比较次数,移动次数 第四行:Shell排序前的顺序表 第五行:Shell排序后的顺序表 可以看出shell根本不需要排序,移动次数为0...... 代码太长截取一部分有用的: ``` #define _CRT_SECURE_NO_DEPRECATE #include<stdio.h> #include<stdlib.h> #include<time.h> typedef int Position; typedef int ElemType; typedef int Status; int compare1=0,compare2=0,compare3=0,compare4=0,compare5=0,compare6=0;//比较次数 int move1 = 0, move2 = 0, move3 = 0, move4 = 0, move5 = 0, move6 = 0;//移动次数 ElemType*p, *q; #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 #define OK 1; #define TRUE 1; #define FALSE 0; #define ERROR 0; #define OVERFLOW -2; /*①SqList.h线性表的动态分配顺序存储结构*/ typedef struct { int key; }lkey; typedef struct { lkey *elem; int length; int listsize; }SqList; /*②顺序表基本操作接口定义*/ //操作结果:构造一个空的线性表 Status InitList_Sq(SqList &L); //操作结果:在L中第i个元素之前插入新的元素e,L的长度加1 Status ListInsert_Sq(SqList &L, int i, ElemType e); //操作结果:依次对L的每个数据元素调用(*visit)(),一旦(*visit)()失败,则操作失败 Status ListTraverse_Sq(SqList L, Status(*visit)(ElemType)); //将元素e的值打印出来 Status visit_sp(ElemType e); //直接插入排序 void InsertSort(SqList L); //希尔排序 void ShellSort(SqList L, int dlta[], int t); void Shell(SqList L, int dk);//一趟希尔插入排序 //起泡排序 void BubbleSort(SqList L); //快速排序 void QuickSort(SqList L); void Quick(SqList L, int low, int high); int QsortPartion(SqList L, int low, int high);//一趟快速排序 //简单选择排序 void SelectSort(SqList L); //堆排序 void HeapSort(SqList L); void HeapAdjust(SqList L, int s, int m);//建大顶堆函数 //随机生成数构造线性表 Status InitList_Sq(SqList &L) { int i; L.elem = (lkey*)malloc(LIST_INIT_SIZE * sizeof(lkey)); if (!L.elem)exit(-2); L.length = 0; L.listsize = LIST_INIT_SIZE; //srand((unsigned)time(NULL)); for (i = 1; i < 15; i++) { L.elem[i].key = rand() % 100 + 1; ListInsert_Sq(L, i, L.elem[i].key); } return OK; /*请参考课本上的算法2.3*/ } //在L中第i个元素之前插入新的元素e,L的长度加1 Status ListInsert_Sq(SqList &L, int i, ElemType e) { if (i<1 || i>L.length + 1) return ERROR; if (L.length >= L.listsize) { lkey*newbase = (lkey*)realloc(L.elem, (L.listsize + LISTINCREMENT) * sizeof(lkey)); if (!newbase)return ERROR; L.elem = newbase; L.listsize += LISTINCREMENT; } q = &(L.elem[i - 1].key); for (p = &(L.elem[L.length - 1].key); p >= q; --p) *(p + 1) = *p; *q = e; ++L.length; return OK; /*请参考课本上的算法2.4*/ } //操作结果:依次对L的每个数据元素调用(*visit)(),一旦(*visit)()失败,则操作失败 Status ListTraverse_Sq(SqList L, Status(*visit)(ElemType)) { int i; for (i = 1; i <= L.length; i++) (*visit)(L.elem[i - 1].key); printf("\n"); return OK; } //将元素e的值打印出来 Status visit_sp(ElemType e) { printf("%d ", e); return OK; } //直接插入排序 void InsertSort(SqList L) { int compare1 = 0, move1 = 0; int i=0, j=0; lkey rc; for (i = 1; i<L.length; ++i)//从第二个开始 { compare1++; if (L.elem[i].key < L.elem[i - 1].key) { move1 += 2; rc = L.elem[i]; L.elem[i] = L.elem[i - 1]; for (j = i - 2; j >= 0 && rc.key < L.elem[j].key; --j)//从i-2个开始 { compare1++; L.elem[j + 1] = L.elem[j]; move1++; } L.elem[j + 1] = rc; move1 += 3; } } ListTraverse_Sq(L,visit_sp); printf("%d %d\n", compare1, move1); } //希尔排序 void ShellSort(SqList L, int dlta[], int t) { ListTraverse_Sq(L, visit_sp); int k; for (k = 0; k < t; k++) Shell(L, dlta[k]); ListTraverse_Sq(L, visit_sp); printf("%d %d\n", compare2, move2); } void Shell(SqList L, int dk)//一趟希尔插入排序 { lkey rc; int j; for (int i = dk; i < L.length; i++) { compare2++; if (L.elem[i].key < L.elem[i - dk].key)//比较i和i-dk { rc = L.elem[i]; move2++; for (j = i - dk; j >= 0 && (rc.key < L.elem[j].key); j -= dk)//[6]和[3],[0]比较 { compare2++; L.elem[j + dk] = L.elem[j];//记录后移,查找插入位置 move2++; } L.elem[j + dk] = rc;//插入 move2++; } } } int main() { SqList L; int i; int dita[3] = { 5,3,1 }, t = 3; for (i = 0; i <= 5; i++) { printf("当前随机数为:\n"); InitList_Sq(L); ListTraverse_Sq(L, visit_sp); InsertSort(L); ShellSort(L, dita, t); //BubbleSort(L); //QuickSort(L); //SelectSort(L); //HeapSort(L); /*printf("------|-比较次数-||-移动次数-|\n"); printf("Insert| %d || %d |\n", compare1, move1); printf("Shell | %d || %d |\n", compare2, move2); printf("Bubble| %d || %d |\n", compare3, move3); printf("Quick | %d || %d |\n", compare4, move4); printf("Select| %d || %d |\n", compare5, move5); printf("Heap | %d || %d |\n", compare6, move6);*/ } system("pause"); return 0; } ```

C语言PBC库中的动态数组问题

我在用PBC库进行椭圆曲线上的属性签名仿真时遇到如下问题: ``` printf("请输入总的属性个数:\n"); scanf("%d",&n); for(i=1;i<=n;i++) { element_random(ti);//随机生成元素变量ti darray_append(Lt,ti);//向动态数组Lt中追加元素变量ti element_printf("t%d=%B\n",i,ti);//单独打印输出 } darray_show(Lt);//再次打印数组 ``` 动态数组已经定义并初始化了,但显示结果却是这样: ![追加图片说明](https://img-ask.csdn.net/upload/201804/25/1524643100_394481.png) 通过darray_show()函数打印的值是完全一样的16进制数!我想知道是darray_show()函数的问题,还是函数darray_append()的问题或者其它。两个函数的源程序如下: ``` void darray_show(darray_ptr a) { int i; for (i=0;i<a->count;i++) { printf("%d:%p\n",i,a->item[i]); } } ``` ``` void darray_append(darray_t a, void *p) { if (a->count == a->max) { if (!a->max) a->max = max_init; else a->max *= 2; a->item = pbc_realloc(a->item, sizeof(void *) * a->max); } a->item[a->count] = p; a->count++; } ``` 我试着把函数darray_show()中的字符格式%p改为%B后显示如下: ![图片说明](https://img-ask.csdn.net/upload/201804/25/1524647639_542719.png)此时0,1,2后面显示了不同的值, 在此恳请大佬们指点一下,谢谢!

Arduino C编程中free()函数挂机

最近我在尝试写一个描述机器人比赛场地的代码时,在内存分配上遇到了挂机的问题。代码在Arduino提供的编译平台上全部通过,但是在实际运行时,往往无法跑完测试程序。经过测试发现代码在obstacle对象的构造函数中调用的segajouter(segment tmp)的free(void*ptr)函数中挂机。Arduino使用的是Uno 主题测试程序如下: #include "ensemble.h" #include "segment.h" #include "jonction.h" #include "obstacle.h" ensemble set,set2;//结点集合类对象 long x=10,y=45,g=3,h=0;//设置参数 void setup() { Serial.begin(115200); Serial.println(F("Please input a digit:")); } void loop() { //===================================================== //Teste de la classe obstacle障碍物类测试 jonction test; if(Serial.available()>0) { Serial.print(F("Free Ram: "));//显示可用内存 Serial.println(freeRam());//显示可用内存 Serial.read(); Serial.print(set2.length()); for(int i=0;i<4;i++) { test.set_point(x,y); test.set_g(g); test.set_h(h); x=y-x; y=g+x; g=x*g; h=g-y; set2.ajouter(test); Serial.print(F("Free Ram: ")); Serial.println(freeRam()); output(set2.jonc()[i]);//输出读取内容(可能有出入) //因为添加结点时已经对集合中元素依据f()的大小 //排序 } Serial.print(F("Free Ram:"));//显示可用内存 Serial.println(freeRam());//显示可用内存 obstacle obs(set2); Serial.print(F("Free Ram:"));//显示可用内存 Serial.println(freeRam());//显示可用内存 Serial.print(F("NumJonc:"));//输出结点数 Serial.println(obs.NumJonc()); Serial.print(F("NumEdge:"));//输出边数 Serial.println(obs.NumEdge()); set=obs.jonc(); Serial.println(F("Set2:")); for(int i=0;i<set2.length();i++)//查看set2对象记录的结点 output(set2.jonc()[i]); Serial.println(F("Set:"));//查看set对象记录的结点 for(int i=0;i<set.length();i++) output(set.jonc()[i]); set.vide();//清空set对象 Serial.print(F("Length de set:"));//查看set对象元素个数 Serial.println(set.length()); x=h;//重新设置测试值 y=g; g=y-x; h=g/2; for(int i=0;i<2;i++) { test.set_point(x,y); test.set_g(g); test.set_h(h); x=y-x; y=g+x; g=y%x; h=g*x; set.ajouter(test);//更新set集合 } Serial.println(F("Set:"));//查看set元素 for(int i=0;i<set.length();i++) output(set.jonc()[i]); obstacle ob(set);//创建障碍物对象 if(ob==obs)//检测重载算符== Serial.println(F("True")); else { Serial.println(F("False")); ob.reset(set2);//重置ob,使得ob与obs相同 if(ob==obs)//检测重载算符== Serial.println(F("True")); else Serial.println(F("Err")); } } } //功能函数 void output(jonction test1)//输出结点参数 { Serial.print(F("(x,y,F,G,H)")); Serial.print('('); Serial.print(test1.getx()); Serial.print(','); Serial.print(test1.gety()); Serial.print(','); Serial.print(test1.f()); Serial.print(','); Serial.print(test1.g()); Serial.print(','); Serial.print(test1.h()); Serial.println(')'); } long input()//读取输入 { long n=0; boolean flag=false; char ch; if(Serial.available()>0) { ch=Serial.read(); if(ch=='-') { flag=true; delay(2); ch=Serial.read(); } n=long(ch-'0'); delay(2); } while(Serial.available()>0) { ch=Serial.read(); if((ch-'0')<10&&(ch-'0')>=0) n=10*n+long(ch-'0'); else break; delay(2); } if(flag) n*=-1; return n; } int freeRam ()//检测可用内存 { extern int __heap_start, *__brkval; int v; return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); } 类里头是这样定义的: #include "obstacle.h" #include "ensemble.h" #include "segment.h" #include "stdlib.h" #include "Arduino.h" int freeRam1 () { extern int __heap_start, *__brkval; int v; return (int) &v - (__brkval == 0 ? (int) &__heap_start : (int) __brkval); } void obstacle::segajouter(segment tmp) //Generer une liste de segment dynamiquement //n indique le nombre des éléments de *s { segment *ss; n+=1; Serial.print(F("Hello ")); ss=(segment*)malloc(sizeof(tmp)*n); if (ss == NULL) Serial.println(F("malloc failed!")); for(int i=0;i<n-1;i++) ss[i]=edge[i]; ss[n-1]=tmp; // s=(segment*)realloc(edge,n*sizeof(tmp)); Serial.print(F("brave ")); // if(s!=NULL) // edge=s; // edge[n-1]=tmp; free(edge); Serial.println(F("world!")); edge=ss; ss=NULL; } obstacle::obstacle(ensemble set) { vertex=set; Serial.print(F("Free Ram: ")); Serial.println(freeRam1()); N=set.length(); n=0; Serial.println(F("Loop")); for(int i=0;i<N-1;i++) for(int j=i+1;j<N;j++) { segment tmp(vertex.jonc()[i],vertex.jonc()[j]); segajouter(tmp); Serial.print(F("i=")); Serial.print(i); Serial.print(F(" j=")); Serial.println(j); Serial.print(F("Free Ram: ")); Serial.println(freeRam1()); } } int obstacle::NumJonc() { return N; } int obstacle::NumEdge() { return n; } void obstacle::reset(ensemble set) { vertex=set; free(edge); N=set.length(); n=0; for(int i=0;i<N-1;i++) for(int j=i+1;j<N;j++) { segment tmp(vertex.jonc()[i],vertex.jonc()[j]); segajouter(tmp); } } ensemble obstacle::jonc() { return vertex; } segment* obstacle::Edge() { return edge; } boolean obstacle::operator ==(obstacle ob) { if(ob.jonc().length()==vertex.length()&&ob.jonc().jonc()==vertex.jonc()) return true; return false; } 以下是第一次在单片机上跑程序的反馈(由于原注释是部分使用法语的,可能与前面的程序的显示内容有点出入): Veuillez entrer huit nombres en les séparant par ' ': Free Ram: 1737 0Free Ram: 1713 (x,y,F,G,H)(10,45,3,3,0) Free Ram: 1667 (x,y,F,G,H)(35,38,172,105,67) Free Ram: 1599 (x,y,F,G,H)(3,108,522,315,207) Free Ram: 1509 (x,y,F,G,H)(105,420,65730,33075,32655) Free Ram:1509 Free Ram: 1435 Loop Hello brave world! i=0 j=1 Free Ram: 1435 Hello brave world! i=0 j=2 Free Ram: 1435 Hello brave world! i=0 j=3 Free Ram: 1301 Hello brave world! i=1 j=2 Free Ram: 1123 Hello brave world! i=1 j=3 Free Ram: 901 Hello brave world! i=2 j=3 Free Ram: 901 Free Ram:975 NumJonc:4 NumEdge:6 Set2: (x,y,F,G,H)(10,45,3,3,0) (x,y,F,G,H)(35,38,172,105,67) (x,y,F,G,H)(3,108,522,315,207) (x,y,F,G,H)(105,420,65730,33075,32655) Set: (x,y,F,G,H)(10,45,3,3,0) (x,y,F,G,H)(35,38,172,105,67) (x,y,F,G,H)(3,108,522,315,207) (x,y,F,G,H)(105,420,65730,33075,32655) Length de set:0 Set: (x,y,F,G,H)(33390,66780,0,0,0) (x,y,F,G,H)(0,33390,115621,33390,16695) Free Ram: 901 Loop Hello brave world! i=0 j=1 Free Ram: 901 False Hello brave world! He

使用双栈实现中缀表达式求值一个字符栈一个数字栈

程序写好没输出啊,急求啊......主要BUG 在Nibolansuanfa()这个自定义函数里面前面的可以忽略..... /*核心函数*/ double Nibolansuanfa(char *str,stack *s) { initstack(&s);//初始化栈 char st[20],tc,xy;//st[20]里面放数字字符串 int j=0,i=0,yxcount=0; double d; while(str[j]!='\0') { /*数字字符拷贝*/ if(Isnum(str[i])) { while(Isnum(str[i])) { st[i]=str[j];//将数字字符串放到st数组 i++; j++; } /*数字字符转换并进数字栈*/ i=0; d=atof(st); pushdb(s,d); st[20]=0; continue; } /*非数字字符进字符栈*/ else if(!IsRxz(str[j])&&!Isnum(str[j])) { pushchar(s,str[j]); j++; } else if(Isysf(str[j])) { tc=popchar(s); pushchar(s,tc); Cmpysf(str[j],tc); if(Cmpysf(str[j],tc)) YsStackdb(str[j],s); else pushchar(s,str[j]); j++; } else if(IsRxz(str[j]))//遇到右限制处理 { if(str[j]==')')//遇到小括号 while((tc=popchar(s))!='(') { if(Isysf(tc)) { xy=popchar(s); pushchar(s,xy); if(Isysf(xy)) { if(Cmpysf(tc,xy)) YsStackdb(tc,s); else pushchar(s,tc); } j++; } else { printf("中缀表达式格式错误!"); exit(0); } } if(str[j]==']')//遇到中括号 while((tc=popchar(s))!='[') { if(Isysf(tc)) { xy=popchar(s); pushchar(s,xy); if(Isysf(xy)) { if(Cmpysf(tc,xy)) YsStackdb(tc,s); else pushchar(s,tc); } j++; } else { printf("中缀表达式格式错误!"); exit(0); } } if(str[j]=='}')//遇到大括号 while((tc=popchar(s))!='{') { if(Isysf(tc)) { xy=popchar(s); pushchar(s,xy); if(Isysf(xy)) { if(Cmpysf(tc,xy)) YsStackdb(tc,s); else pushchar(s,tc); } j++; } else { printf("中缀表达式格式错误!"); exit(0); } } } else { printf("中缀表达式格式错误!"); exit(0); } } if(--(s->topdb)==s->bottomdb) return popdb(s); else return 0; } /*全部完整程序*/ #include<stdio.h> #include<math.h> #include<stdlib.h> #include<ctype.h> #define STACKSIZE 100 #define STACKADD 10 /*运算符优先级数据结构*/ struct Yxsz { char ysf; int yxj; } ysz[]={{'(',6},{')',0},{'[',6},{']',1},{'{',6},{'}',2},{'#',3},{'^',3},{'*',4},{'/',4},{'+',5},{'-',5}}; /*char类型与double类型的双栈结构*/ typedef struct { char *topchar; char *bottomchar; int charStackSize; double *topdb; double *bottomdb; int doubleStackSize; }stack; /*初始化栈*/ void initstack(stack *s) { s->bottomchar=(char*)malloc(STACKSIZE*sizeof(char)); if(!s->bottomchar) exit(0); s->topchar=s->bottomchar; s->charStackSize=STACKSIZE; s->bottomdb=(double *)malloc(STACKSIZE*sizeof(double)); if(!s->bottomdb) exit(0); s->topdb=s->bottomdb; s->doubleStackSize=STACKSIZE; } /*字符入栈*/ void pushchar(stack *s,char a) { if(s->topchar-s->bottomchar>=STACKSIZE) { s->bottomchar=(char*)realloc(s->bottomchar,(s->charStackSize+STACKADD)*sizeof(char)); if(!s->bottomchar) exit(0); } *(s->topchar)=a; s->topchar++; } /*数字入栈*/ void pushdb(stack *s,double b) { if(s->topdb-s->bottomdb>=STACKSIZE) { s->bottomdb=(double *)realloc(s->bottomdb,(s->doubleStackSize+STACKADD)*sizeof(double)); if(!s->bottomdb) exit(0); } *(s->topdb)=b; s->topdb++; } /*字符出栈*/ char popchar(stack *s) { char i; if(!s&&s->topchar==s->bottomchar) exit(0); i=*(--s->topchar); return i; } /*数字出栈*/ double popdb(stack *s) { double i; if(!s&&s->topdb==s->bottomdb) exit(0); i=*(--s->topdb); return i; } /*清空栈*/ int Cealenstack(stack *s) { if(!s) return 0; s->topchar=s->bottomchar; s->topdb=s->bottomdb; return 1; } /*销毁栈*/ void Destorystack(stack *s) { int lenchar=stackcharLen(s),lendb=stackdblen(s); if(!s) exit(0); while(lenchar) { *(--s->topchar)=NULL; lenchar--; } while(lendb) { *(--s->topdb)=0; lendb--; } } /*计算字符栈长度*/ int stackcharLen(stack *s) { return(s->topchar-s->bottomchar); } /*计算数字栈长度*/ int stackdblen(stack *s) { return (s->topdb-s->bottomdb); } /*以下为程序核心*/ /*将中缀字符串转换成后缀然后求值这个函数有点复杂,定义在主函数下面*/ double Nibolansuanfa(char *str,stack *s); /*字符是右限制符号*/ int IsRxz(char i) { if(i==')'||i==']'||i=='}') return 1; else return 0; } /*字符是运算符*/ int Isysf(char i) { if(i=='*'||i=='/'||i=='^'||i=='#'||i=='+'||i=='-') return 1; else return 0; } /*字符是数字字符*/ int Isnum(char i) { if(i>='0'&&i<='9'||i=='.') return 1; else return 0; } /*比较栈里上下两个运算符的优先级如果前一个优先级比后一个大或者同级返回前一个字符,别的返回0*/ char Cmpysf(char a,char b) { int j=0,i=0; while(ysz[j].ysf!=a) j++; while(ysz[i].ysf!=b) i++; if(ysz[j].yxj<=ysz[i].yxj) return a; else return 0; } /*遇到运算符直接在数字栈里面处理并计算*/ void YsStackdb(char i,stack *s) { int k,j; switch(i) { case '#': k=popdb(s); j=popdb(s); pushdb(s,pow(j,1.0/k)); break; case '^': k=popdb(s); j=popdb(s); pushdb(s,pow(j,k)); break; case'*': k=popdb(s); j=popdb(s); pushdb(s,j*k); break; case'/': k=popdb(s); j=popdb(s); pushdb(s,j/k); break; case'+': k=popdb(s); j=popdb(s); pushdb(s,j+k); break; case'-': k=popdb(s); j=popdb(s); pushdb(s,j-k); break; } return; } /*主函数*/ int main(void) { stack *sk; char str[100]; printf("请输入一个中缀表达式:"); scanf("%s",str); printf("结果:%lf\n",Nibolansuanfa(str,sk)); return 0; } /*核心函数*/ double Nibolansuanfa(char *str,stack *s) { initstack(&s);//初始化栈 char st[20],tc,xy;//st[20]里面放数字字符串 int j=0,i=0,yxcount=0; double d; while(str[j]!='\0') { /*数字字符拷贝*/ if(Isnum(str[i])) { while(Isnum(str[i])) { st[i]=str[j];//将数字字符串放到st数组 i++; j++; } /*数字字符转换并进数字栈*/ i=0; d=atof(st); pushdb(s,d); st[20]=0; continue; } /*非数字字符进字符栈*/ else if(!IsRxz(str[j])&&!Isnum(str[j])) { pushchar(s,str[j]); j++; } else if(Isysf(str[j])) { tc=popchar(s); pushchar(s,tc); Cmpysf(str[j],tc); if(Cmpysf(str[j],tc)) YsStackdb(str[j],s); else pushchar(s,str[j]); j++; } else if(IsRxz(str[j]))//遇到右限制处理 { if(str[j]==')')//遇到小括号 while((tc=popchar(s))!='(') { if(Isysf(tc)) { xy=popchar(s); pushchar(s,xy); if(Isysf(xy)) { if(Cmpysf(tc,xy)) YsStackdb(tc,s); else pushchar(s,tc); } j++; } else { printf("中缀表达式格式错误!"); exit(0); } } if(str[j]==']')//遇到中括号 while((tc=popchar(s))!='[') { if(Isysf(tc)) { xy=popchar(s); pushchar(s,xy); if(Isysf(xy)) { if(Cmpysf(tc,xy)) YsStackdb(tc,s); else pushchar(s,tc); } j++; } else { printf("中缀表达式格式错误!"); exit(0); } } if(str[j]=='}')//遇到大括号 while((tc=popchar(s))!='{') { if(Isysf(tc)) { xy=popchar(s); pushchar(s,xy); if(Isysf(xy)) { if(Cmpysf(tc,xy)) YsStackdb(tc,s); else pushchar(s,tc); } j++; } else { printf("中缀表达式格式错误!"); exit(0); } } } else { printf("中缀表达式格式错误!"); exit(0); } } if(--(s->topdb)==s->bottomdb) return popdb(s); else return 0; }

(fh>=0&&(unsigned)fh <(unsigned)_nhandle)出错

int k =0; string testimgurlofat;//全局变量的初始化 void Find(LPCTSTR lpszFileName) { CString strWildcard = lpszFileName; strWildcard += _T("\\*.dat"); CFileFind finder; BOOL bFind = FALSE; //查找文件 bFind = finder.FindFile(strWildcard); while (bFind) { k=k+1; TCHAR *buff; testimgurlofat = (TCHAR *) malloc( Buff_size * sizeof (TCHAR)); bFind = finder.FindNextFile(); TCHAR argv[][13] = {"美","丽","赵","张","募","易"}; int m ; for(m=0;m<6;m++){ TCHAR destinationkey[][10]= {"/l/","/s/","/q/","/z/","/m/","/y/"}; int n; for(n=0;n<6;n++) { memset( &testimgurlofat, 0, Buff_size ); //使用strncat最容易忘记 清空数组。 //获得找到文件的名称 CString strFileName = finder.GetFileName(); if(strstr(strFileName,argv[m])) { //testurlifat = (char *)realloc(testurlifat, strlen(testurlifat) + strlen(destinationkey[0] )+1); testimgurlofat = destinationkey[n]; } } } } cout << testimgurlofat << endl; //判断找到文件的是否包含"."或".." if (finder.IsDots()) { continue; } //获得找到文件的名称 if (finder.IsDirectory()) { //找到文件的路径 CString strFilePath = finder.GetFilePath(); //递归查找文件 Find(strFilePath); } cout << k<< endl; // free(testimgurlofat); } //结束查找 finder.Close(); } 两个多线程函数同时引用Find(lpszFileName)函数,运用两个相同值的“全局变量”组成新的字符串! 提示close.c这里的 (fh>=0&&(unsigned)fh <(unsigned)_nhandle)出错,已定位到两个引用同个“全局变量”的函数出错,因为我去掉这两个函数,程序没报错! 按Alt+7键查看Call Stack里面从上到下列出的对应从里层到外层的函数调用历史,查到close.c的报错提示, int __cdecl _close ( int fh ) { int r; /* return value */ /* validate file handle */ _CHECK_FH_CLEAR_OSSERR_RETURN( fh, EBADF, -1 ); _VALIDATE_CLEAR_OSSERR_RETURN((fh >= 0 && (unsigned)fh < (unsigned)_nhandle), EBADF, -1); _VALIDATE_CLEAR_OSSERR_RETURN((_osfile(fh) & FOPEN), EBADF, -1); _lock_fh(fh); /* lock file */ __try { if ( _osfile(fh) & FOPEN ) r = _close_nolock(fh); else { errno = EBADF; r = -1; _ASSERTE(("Invalid file descriptor. File possibly closed by a different thread",0));//怀疑两个多线程函数同时引用Find(lpszFileName)函数,文件可能被不同的线程关闭! } } __finally { _unlock_fh(fh); /* unlock the file */ } return r; } 程序中断在close.c的 _unlock_fh(fh); /* unlock the file */处。不知道怎么回事啊,调试了几天时间都没有解决,求各位大侠帮忙,江湖救急!在此谢过!

VS2013 在debug模式下编译没有错误,但使用release模式,就有一堆错误

#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include "字符串.h" int main() { Mystring string1; initwithstring(&string1, "xhqld"); printstring(&string1); backaddchar(&string1, 'd'); printstring(&string1); backaddstr(&string1, "forever"); printstring(&string1); char * p = NULL; p = findfirstchar(&string1, 'd'); *p = 'a'; printstring(&string1); char * p1 = mystrstr(string1.p, "ever"); if (p1 != NULL) printf("%c\n", *p1); else printf("not find\n"); printf("--------------\n"); deletechar(&string1, 'a'); printstring(&string1); printf("--------------\n"); deletestring(&string1, "for"); printstring(&string1); printf("--------------\n"); addchar(&string1, 'W', 'e'); printstring(&string1); printf("--------------\n"); addstring(&string1, "lol",'W'); printstring(&string1); system("pause"); return 0; } ``` #include<stdio.h> #include<stdlib.h> struct CString { char * p;//保存字符串的首地址 int length;//字符串长度 }; typedef struct CString Mystring; void init(Mystring * string);//初始化字符串 void initwithlength(Mystring * string, int length); void initwithstring(Mystring *string, char * copystring);// void printstring(Mystring * string);//打印字符串 int mystrlen(char * p);//求字符串长度 char * mystrcpy(char * dest, const char * source);//字符串复制 void backaddchar(Mystring * string, char ch);//尾部增加一个字符 void backaddstr(Mystring * string, char * str);//尾部增加一个字符串 char * findfirstchar(Mystring * string, char ch);//查找第一个匹配字符 char * mystrchr(char * str, char ch);//查找字符 char * mystrstr(char * dest, char * str);//字符串比较函数 int deletechar(Mystring * string, char ch);//删除一个字符 int deletestring(Mystring * string, char * str);//删除一个字符串 void addchar(Mystring * string, char ch, char searchchar);//任意增加字符 void addstring(Mystring * string, char *str, char searchchar);//任意增加字符串 ``` #define _CRT_SECURE_NO_WARNINGS #include"字符串.h" #include<string.h> void init(Mystring * string)//初始化字符串 { string->length = 0; string->p = NULL; } void initwithlength(Mystring * string, int length) { //Mystring * p = (char *)malloc(sizeof(char)*length); Mystring * p = (char *)calloc(length, sizeof(char));//calloc为分配的内存清零,malloc不清零 } void initwithstring(Mystring *string, char * copystring)// { int length = mystrlen(copystring); string->p = (char *)calloc(length + 1, sizeof(char)); mystrcpy(string->p, copystring); string->length = length + 1; } void printstring(Mystring * string)//打印字符串 { printf("%s\n", string->p); } int mystrlen(char * p) { if (p != NULL) { int length = 0; while (*p++ != '\0') length++; return length; } else return -1;//打开失败 } char * mystrcat(char * dest, const char * source) { if (dest == NULL || source == NULL) return NULL; char * pdest = dest; while (*pdest != '\0') pdest++; while (*source != '\0') *pdest++ = *source++; *pdest = '\0'; return dest; } char * mystrcpy(char * dest, const char *source) { if (dest == NULL || source == NULL) return NULL; char * pdest = dest; while (*source != '\0') *pdest++ = *source++; *pdest = '\0'; return dest; } void backaddchar(Mystring * string, char ch)//尾部增加一个字符 { if (mystrlen(string->p) + 2 > string->length)//表达式成立,则表示已满 { string->p = (char *)realloc(string->p, string->length + 2); string->p[string->length - 1] = ch; string->p[string->length] = '\0'; printf("%s\n", string->p); string->length += 2; } else { string->p[mystrlen(string->p)] = ch; string->p[mystrlen(string->p) + 1] = '\0'; } } void backaddstr(Mystring * string, char * str)//尾部增加一个字符串 { if (str != NULL) { if ( mystrlen(string->p) + mystrlen(str) +1 > string->length) { int length = mystrlen(str); string->p = (char *)realloc(string->p, string->length + length + 1); mystrcat(string->p, str); string->p[string->length + length] = '\0'; string->length = string->length + length + 1; } else { mystrcat(string->p, str); string->p[mystrlen(string->p) + mystrlen(str)] = '\0'; } } } char * findfirstchar(Mystring * string,const char ch) { char * p = mystrchr(string->p, ch); return p; } char * mystrchr(char * str, char ch) { if (str != NULL || ch != '\0') { char * pstr = str; while (*pstr != '\0') { if (*pstr == ch) return pstr; pstr++; } return NULL; } } char * mystrstr(char * dest, char * str) { char * pdest = dest; char * pstr = str; int str_length = mystrlen(str); int dest_length = mystrlen(dest); if (str_length <= dest_length) { int flag = 0; int i = 0; while (dest_length - i >= str_length && flag == 0) { if (pdest[i] == pstr[0]) { flag = 1; for (int k = 1; k < str_length && flag == 1; k++) flag = pdest[i + k] == pstr[k] ? 1 : 0; } i++; } return flag == 1 ? &pdest[i - 1] : NULL; /*if (flag == 1) return &pdest[i - 1]; else return NULL;*/ } } int deletechar(Mystring * string, char ch)//删除一个字符 { char * p = mystrchr(string->p, ch); if (p != NULL ) { while (*p != '\0') *p++ = *(p + 1); *--p = '\0'; return 1; } return 0; } int deletestring(Mystring * string, char * str)//删除一个字符串 { char * p = mystrstr(string->p, str);//查找字符串位置 if (p != NULL) { int str_length = mystrlen(str);//计算被查找子串的长度 int string_length = mystrlen(string->p);//计算母串string的长度 char * pend = p + str_length;//pend指向string->p中被查找子串的尾部 while (* pend != '\0')//把被查找子串后面的字符前移,覆盖被查找的子串 *p++ = *pend++; string->p[string_length - str_length] = '\0';//为删除str子串后的string母串设置新的字符串结束符 return 1; } return 0; } void addchar(Mystring * string, char addchar, char searchchar)//任意增加字符 { char * position = mystrchr(string->p, searchchar); if (position != NULL) { int string_length = mystrlen(string->p);//求母串的长度 int position_length = mystrlen(position);//求从插入字符的前面位置开始到字符串末尾处,要移动字符的个数 if (string_length + 2 > string->length)//判断是否满了 { string->p = (char *)realloc(string->p, string_length + 2); for (int i = string_length; i > string_length - position_length; i--)//从插入位置开始将剩下的字符窜后移 string->p[i] = string->p[i - 1]; string->p[string_length + 1] = '\0';//重新设置字符串结束符 *position = addchar;//插入字符串 string->length += 1;//字符串实际长度增加 } else { for (int i = string_length; i > string_length - position_length; i--)//从插入位置开始将剩下的字符窜后移 string->p[i] = string->p[i - 1]; string->p[string_length + 1] = '\0';//重新设置字符串结束符 *position = addchar;//插入字符串 } } } void addstring(Mystring * string, char *str, char searchchar)//任意增加字符串 { printf("test:%d\n", string->length); char * position = mystrchr(string->p, searchchar); if (position != NULL) { int string_length = mystrlen(string->p);//求母串的长度 int position_length = mystrlen(position);//求从插入字符的前面位置开始到字符串末尾处,要移动字符的个数 int str_length = mystrlen(str);//求要添加子串的长度 if (string_length + str_length + 1 > string->length)//判断以前分配的空间是否够用 { string->p = (char *)realloc(string->p, string_length + str_length + 1); string->length += str_length; for (int i = string_length; i >= string_length - position_length; i--)//移动字符,连同字符串结束符一起移动 string->p[i + str_length] = string->p[i]; for (int i = string_length - position_length; i <= string_length - 1; i++) string->p[i] = *str++; } else { for (int i = string_length; i >= string_length - position_length; i--)//移动字符,连同字符串结束符一起移动 string->p[i + str_length ] = string->p[i]; for (int i = string_length - position_length; i < string_length - position_length + str_length; i++) { printf("test:%d,%c\n", i, string->p[i]); string->p[i] = *str++; printf("test:%d,%c\n", i, string->p[i]); } } } } ![图片说明](https://img-ask.csdn.net/upload/201509/11/1441974183_586216.png) 错误代码片段如下: char * position = mystrchr(string->p, searchchar); if (position != NULL) char * p = mystrchr(string->p, ch); return p; char * p = findfirstchar(&string1, 'd'); *p = 'a';

c语言 大量数据在写入文件时会崩溃 急求问题所在和解决办法

想实现的功能是建立一堆文本文件的索引,但是现在已经成功创建了一个索引表,但把索引表存入文件的时候就会进行到一半然后崩溃 需要在目录下创建一个book文件夹储存信息 现在的问题 信息太多时候写入最后save_index 崩溃 释放内存好像不行 代码如下 头文件 ``` #ifndef Searchengine_H #define Searchengine_H #include <stdio.h> #include <windows.h> #include<stdlib.h> struct word_place //保存单词的地址 { int book_id; char book_name[30]; long int location; }; typedef struct word_place place; typedef struct key* key_node; struct key //为每个关键词创造一个节点 { int id; char key[20]; int find_number; place *places; }; key_node key_information[1000000]; struct file_inf //搜索文件的序号 { int number; char name[100]; }file_information[10000]; void find(char * lpPath); int find_word(char* word); void add_key(char* word,int num,long int place) ; int is_letter(char c) ; void index_a_book(int num) ; void kuaipai(int left,int right,key_node a[]) ; void save_index(int x); #endif ``` 遍历文件夹获取文件信息的文件 ``` #include"search_engine.h" void find(char * lpPath) //读取一个文件夹的文件名 { int i=0; char szFind[MAX_PATH],szFile[MAX_PATH]; WIN32_FIND_DATA FindFileData; HANDLE hFind; strcpy(szFind,lpPath); strcat(szFind,"\\*.*"); hFind = FindFirstFile(szFind,&FindFileData); if(INVALID_HANDLE_VALUE == hFind) return; while(TRUE) { if(FindFileData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) { if(FindFileData.cFileName[0]!='.') { strcpy(szFile,lpPath); strcat(szFile,"\\"); strcat(szFile,FindFileData.cFileName); find(szFile); } } else { // printf("%s\n",FindFileData.cFileName); file_information[i].number=i; strcpy(file_information[i].name,FindFileData.cFileName); i++; } if(!FindNextFile(hFind,&FindFileData)) { file_information[i].name[0]='\0'; break; } } } void save_filenum()//储存文件序列 { int i=0; FILE *fp; if((fp=fopen("book index.txt","r+"))==NULL) {printf("open error\n"); exit(0); } char* is_write="0"; fscanf(fp,"%s",&is_write); printf("%c\n",is_write); if (is_write=='0') fclose(fp); else { is_write="1"; fseek(fp,0,0); fprintf(fp,"%s\n",is_write); } for(i=0;file_information[i].name[0];i++) { fprintf(fp,"%d ",file_information[i].number); fprintf(fp,"%s\n",file_information[i].name); } fclose(fp); } ``` 创建和储存索引的函数 ``` #include"search_engine.h" int find_word(char* word) //判断是否为已有的关键词 { int i; for(i=0;key_information[i];i++) { if(strcmp(key_information[i]->key,word)==0) break; } return i; }//少一个储存查找的算法 void add_key(char* word,int num,long int place) //把关键词添加到索引中 { int i=find_word(word); if(!key_information[i]) { key_information[i]=(key_node)malloc(sizeof(struct key)); strcpy(key_information[i]->key,word); key_information[i]->find_number=1; key_information[i]->places=(struct word_place*)malloc(100*sizeof(struct word_place)) ; } else key_information[i]->find_number++; int temp=key_information[i]->find_number-1; if(temp%98==0) key_information[i]->places=(struct word_place*)realloc(key_information[i]->places,(temp+100)*sizeof(struct word_place)); strcpy(key_information[i]->places[temp].book_name,file_information[num].name); key_information[i]->places[temp].book_id=num; key_information[i]->places[temp].location=place; } int is_letter(char c) //判断一个字符是否是特殊字符 { if(c >='0' && c<='9') return 1; else if(c >='a' && c<='z' || c >='A' && c<='Z') return 2; else return 0; } void index_a_book(int num) //为一本书中的单词建立索引 { FILE *fp; char* name=file_information[num].name; char way[100]="book\\"; strcat(way,name); printf("%s\n",way); if((fp=fopen(way,"r+"))==NULL) {printf("open error\n"); exit(0); } char* read; read=(char*)malloc(sizeof(char)*100); long int place=0; fseek(fp,0L,SEEK_SET); while(!feof(fp)) { fscanf(fp,"%s",read); if(is_letter(read[strlen(read)-1])==0) read[strlen(read)-1]=0; if(is_letter(read[0])==2)//首为必须为字母 { printf("%s\n",read); add_key(read,num,place); place++; } } fclose(fp); } void kuaipai(int left,int right,key_node a[]) //对列表快速排序 { int i,j; char* middle; key_node temp; i=left; j=right; middle=a[(i+j)/2]->key; do{ while(strcmp(a[i]->key,middle)<0&&i<right) i++; while(strcmp(a[j]->key,middle)>0&&j>left) j--; if(i<=j) { temp=a[i],a[i]=a[j],a[j]=temp; j--; i++; } }while(i<=j); if(left<j) kuaipai(left,j,a); if(right>i) kuaipai(i,right,a); } void save_index(int x)//储存索引 { FILE *fp; if((fp=fopen("word index.txt","w+"))==NULL) {printf("open error\n"); exit(0); } printf("open success\n"); printf("%d",x); int i,j; fprintf(fp,"%d\n",x); i=0; printf("%d %s %d \n",i,key_information[i]->key,key_information[i]->find_number); printf("%c %d",key_information[i]->key[0],is_letter(key_information[i]->key[0])); fprintf(fp,"%d %s %d ",i,key_information[i]->key,key_information[i]->find_number); /* for(i=0;i<100;i++) { fprintf(fp,"%d %s %d ",i,key_information[i]->key,key_information[i]->find_number); for(j=0;j<key_information[i]->find_number;j++) { fprintf(fp,"%d %d ",key_information[i]->places[j].book_id,key_information[i]->places[j].location); } fprintf(fp,"ok\n"); }*/ fclose(fp); } ``` 主函数 ``` #include"search_engine.h" //void add index() int main() { char filepath[MAX_PATH]="book"; //可自己输入文件夹绝对路径 find(filepath); int i=0; /* for(i=0;file_information[i].name[0];i++) { printf("%d %s\n",file_information[i].number,file_information[i].name); }*/ save_filenum(); for(i=0;file_information[i].name[0];i++) { index_a_book(i); } /*for(i=0;key_information[i];i++) { printf("%s\n",key_information[i]->key); } printf("%s\n",key_information[1]->places[0].book_name);*/ int word_num; for(i=0;key_information[i];i++) ; word_num=i-1; kuaipai(0,word_num,key_information); printf("ok\n"); save_index(word_num); system("PAUSE"); for(i=0;key_information[i];i++) { free(key_information[i]); } return 0; } ``` 很急,求大佬解答

一道C++的题,好像是对应的数据类型不对,但是实在是想不到如何修改好这个程序

首先,这个程序的功能是实现顺序表的基本操作,代码如下: ``` //顺序表的基本操作 #include <stdio.h> #include <stdlib.h> #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int ElemType; typedef int Status; //----- 顺序表的顺序存储表示 ----- #define LIST_INIT_SIZE 100 // 存储空间的初始分配量 #define LISTINCREMENT 10 // 存储空间的分配增量 typedef struct { ElemType *elem; // 存储空间的基址 int length; // 表长 int size;// 存储容量 int increment; // 扩容时,增加的存储容量 } SqList; //顺序表 // 构造一个顺序表 Status InitSqlist(SqList &L){ L.elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType)); if(!L.elem) exit (OVERFLOW); L.length = 0; L.size = LIST_INIT_SIZE; L.increment = LISTINCREMENT; return OK; } // 判顺序表是否为空表 Status ListEmpty(SqList L){ if (L.length==0) return OK; else return ERROR; } //顺序表插入函数 Status ListInsert_Sq(SqList &L,int i,int p,int q,int newbase,int increment,ElemType e){ //请在此填写代码,将该算法补充完整 //在顺序线性表L中第i个位置之前插入新的元素e, // i的合法值为1<=i<=ListLength.Sq(L)+1 if (i<1||i>L.length+1)return ERROR;//i值不合法 if(L.length>=L.size){ //当前存储空间已满,增加分配 newbase=(ElemType *)realloc(L.elem,(L.size+increment)*sizeof(ElemType)); if(!newbase)exit(OVERFLOW);//存储分配失败 L.elem=newbase;//新基址 L.size+=increment;//增加存储容量 } q=&(L.elem[i-1]);//q为插入位置 for(p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;//插入位置及之后的元素右移 *q=e;//插入e ++L.length;//表长增1 return OK; }//ListInsert_Sq //顺序表删除元素函数 Status ListDelete_Sq(SqList &L, int i,int p,int q,ElemType &e){ //请在此填写代码,将该算法补充完整 //在顺序线性表L中删除第i个元素,并用e返回其值 //i的合法值为1<=i<=ListLengt_Sq(L) if(i<1||(i>L.length))return ERROR;//i值不合法 p=&(L.elem[i-1]);//p为被删除元素的位置 e=*p;//被删除元素的值赋给e q=L.elem+L.length-1;//表尾元素的位置 for(++p;p<=q;++p)*(p-1)=*p;//被删除元素之后的元素左移 --L.length; return OK; }//ListDe;ete_SQ //输出顺序表函数 void OutList_Sq(SqList L) { int i; ElemType e; if(ListEmpty(L)){ printf("这是一个空表!"); } else { printf("顺序表为:"); for(i=0;i<L.length;i++) printf("%6d",L.elem[i]); } printf("\n"); } //主函数 int main() { SqList L; int cord,i; ElemType a; printf("第一次使用必须初始化!\n"); do{ printf("\n 主菜单 \n"); printf(" 1 初始化顺序表 "); printf(" 2 插入一个元素 "); printf(" 3 删除一个元素 "); printf(" 4 结束程序运行 "); printf("\n-------------------------------------------------------------------\n"); printf("请输入您的选择( 1, 2, 3, 4)"); scanf("%d",&cord); printf("\n"); switch(cord){ case 1: InitSqlist(L); OutList_Sq(L); break; case 2: printf("\n请输入要插入的插入位置和数据元素(如:3 20)"); scanf("%d%d",&i,&a); ListInsert_Sq(L,i,a); printf("\n插入%d元素之后的",a); OutList_Sq(L); break; case 3: printf("\n请输入要删除的数据元素的位置(如: 3)"); scanf("%d",&i); ListDelete_Sq(L,i,a); printf("\n删除第%d个位置的元素之后",i); OutList_Sq(L); break; case 4: exit(0); } }while (cord<=4); return 1; } ``` 然后这个是所有的报错信息,编译器是DEV-C++ ![图片说明](https://img-ask.csdn.net/upload/201811/02/1541121293_791204.png)

有大佬给看看吗?这个程序没有错误,但是不能运行

#include <stdio.h> #include <stdlib.h> #include <string.h> #include<conio.h> #include"windows.h" //*********************************************************************************** int initial_room(); //初始化80个房间信息 int welcome(); //验证用户登陆,登陆成功显示欢迎信息 int enter(); int check_in(); int check_out(); int inquire(); int diancai1(); int i=0; int caijia=0; int pay=0; typedef int ElemType; //*********************************************************************************** struct Room { int number; int rank; int price; int state; }; struct Customer { char name[13],ID[19]; int room_number; int pay; int change; int day; char caiming; int caijia; }; int set_name(struct Customer *cs, char *n) { strcpy(cs->name,n); return 14; } int set_ID(struct Customer *cs, char *p) { strcpy(cs->ID,p); return 13; } int set_room_number(struct Customer *cs, int n) { cs->room_number=n; return 12; } int set_day(struct Customer *cs, int d) { cs->day=d; return 11; } char *get_name(struct Customer *cs) { return cs->name; } char *get_ID(struct Customer *cs) { return cs->ID; } int get_room_number(struct Customer *cs) { return cs->room_number; } int get_day(struct Customer *cs) { return cs->day; } //*********************************************************************************** struct Room room[60]; struct Customer *customer[60]; //diancai struct cai /*cai结构体 实现对菜品 已点份数、名称、原材料 的记录*/ { int fenshu; char name[50]; int use; int price; }; struct List /*该线性表实现对菜品原材料的剩余量的记录,线性表【i】对应菜品的点餐菜单编码*/ { ElemType* list; int size; int MaxSize; }; /*以下为线性表的函数*/ void InitList(struct List* L,int ms) { if(ms<=0){printf("ms 值非法!\n");exit(1);} L->MaxSize=ms; L->list=(int*)malloc(ms*sizeof(ElemType*)); if(!L->list) { printf("动态存储分配失败!"); exit(1); } L->size=0; } void againMalloc(struct List *L) { ElemType *p=(int*)realloc(L->list,2*L->MaxSize*sizeof(ElemType)); if(!p){ printf("分配存储空间失败!"); exit(1); } L->list=p; L->MaxSize=2*L->MaxSize; } void InsertLastList(struct List *L,ElemType x) { if(L->size==L->MaxSize) againMalloc(L); L->list[L->size]=x; L->size++; } /*表格函数*/ int cddayin(struct cai a[]) { int i=0,j=0; for(i=0;i<30;i++) {if(a[i].fenshu>0) j++;} if(j!=0) { printf("已点菜/酒品编号 已点菜品名称 已点份数/瓶数 价格\n"); for(i=0;i<30;i++) if(a[i].fenshu>0) {printf(" %5d %10s%14d %d¥ \n",i,a[i].name,a[i].fenshu,a[i].fenshu*a[i].price); caijia=caijia+a[i].fenshu*a[i].price; } printf(" 您好,您点餐价格合计=%d¥\n",caijia); } return caijia; if(j==0) printf("顾客尚未点餐,无法进行菜单打印!\n"); } void ycliao(struct List *yuan,struct cai a[]) { int i=1,p=0,k=0,num; for(i=0;i<30;i++) { do{ p=a[i].use%100; yuan->list[p]=yuan->list[p]-a[i].fenshu; a[i].use=a[i].use/100; }while(a[i].use!=0); } printf("请输入房间号:"); scanf("%d",&num); if(num=101&&102&&103&&104&&105){ printf("|-------------------------------------------------------|--------------------|\n"); printf("|------------------原材料余量---------------------------|-----酒品余量-------|\n"); printf("|-------------------------------------------------------|--------------------|\n"); printf("| 10.鸡肉=%3d 11.猪肉=%3d 12.鱼肉=%3d | 50.雪花啤酒=%3d |\n",yuan->list[10],yuan->list[11],yuan->list[12],yuan->list[50]); printf("| 13.黄瓜=%3d 14.土豆=%3d 15.豆腐=%3d | 51.燕京啤酒=%3d |\n",yuan->list[13],yuan->list[14],yuan->list[15],yuan->list[51]); printf("| 16.茄子=%3d 17.青椒=%3d 18.牛肉=%3d | 52.二锅头=%3d |\n",yuan->list[16],yuan->list[17],yuan->list[18],yuan->list[52]); printf("| 19.大葱=%3d 20.鲜鸭血=%3d 21.花生=%3d | |\n",yuan->list[19],yuan->list[20],yuan->list[21]); printf("| 22.花椒=%3d 23.酱=%3d 24.胡萝卜=%3d | |\n",yuan->list[22],yuan->list[23],yuan->list[24]); printf("| 25.辣椒=%3d 26.芹菜=%3d 27.豆皮=%3d | |\n",yuan->list[25],yuan->list[26],yuan->list[27]); printf("|-------------------------------------------------------|--------------------|\n"); printf("|-------------------------------------------------------|--------------------|\n"); }} void diancai(struct cai a[],struct Customer *cs ) { int p=0,wep=0; /*printf("请输入房间号\n"); scanf("%d",num); for(i=0;i<60;i++) if(cs->room[n].number==num) */ do{ printf(" |----------------------------------------------|-------------------|\n"); printf(" |----------菜品(输入-1确认并结束点餐)----------|-------酒品--------|\n"); printf(" |----------------------------------------------|-------------------|\n"); printf(" | 1.红烧狮子头 2. 飘香桂鱼 3.京酱肉丝 21.长城干红 |\n"); printf(" | 4.爆炒竹鸡 5.水煮鱼 6.日本豆腐 | 22.喜力啤酒 |\n"); printf(" | 7.夫妻肺片 8.拍黄瓜 9.莲子羹 | 23.人头马 |\n"); printf(" |----------------------------------------------|-------------------|\n"); printf(" |----------------------------------------------|-------------------|\n"); scanf("%d",&p); system("CLS"); if(p>=1&&p<=9) { printf(" |------------------------------------------|\n"); printf(" |------------------份数--------------------|\n"); printf(" |------------------------------------------|\n"); printf(" | 1.一份 2.两份 |\n"); printf(" | 3.三份 4.其他请直接输入 |\n"); printf(" |------------------------------------------|\n"); printf(" |------------------------------------------|\n"); scanf("%d",&wep); if(wep>50) {system("CLS");printf("您输入的值异常或过大,请您检查输入的值!\n");continue;}/*防止误输入*/ else if(wep<=50) {a[p].fenshu+=wep; system("CLS"); } } else if(p>=21&&p<=23) { printf(" |--------------------------------------------------------|\n"); printf(" |-------------------------酒品数量-----------------------|\n"); printf(" |--------------------------------------------------------|\n"); printf(" | 1.一瓶 2.两瓶 3.三瓶 4.其他瓶数请直接输入 |\n"); printf(" |--------------------------------------------------------|\n"); printf(" |--------------------------------------------------------|\n"); scanf("%d",&wep); if(wep>50) {system("CLS");printf("您输入的值异常或过大,请您检查输入的值!\n");continue;}/*防止误输入*/ else if(wep<=50) { a[p].fenshu+=wep; system("CLS"); } } else if(p!=-1) printf("对不起,你输入的编码没有对应菜品,请重新输入!\n"); }while(p!=-1); system("CLS"); cs->caijia=cddayin(a); } void ycldayin(struct List yuan,struct cai a[]) { char l='\0'; printf("显示原材料余量?(Y/N)\n"); l=getch(); if(l=='Y'||l=='y') {system("CLS"); ycliao(&yuan,a);} else { system("CLS"); printf("\n\n\n\n");} } int diancai1(struct Customer *cs) { int i=0; char l='\0'; struct List yuan; /* yuan前不用加“*” */ struct cai a[60]={ {0,"\0",0}, {0,"宫爆鸡丁",10131421,15},{0,"飘香桂鱼",1124,14},{0,"京酱肉丝",112327,16}, {0,"爆炒竹鸡",141617,10},{0,"水煮鱼",122225,50},{0,"日本豆腐",152225,11}, {0,"夫妻肺片",18212625,17},{0,"拍黄瓜",13252223,8},{0,"莲子羹",20,20}, {0,"\0",0},{0,"\0",0},{0,"\0",0}, {0,"\0",0},{0,"\0",0},{0,"\0",0}, {0,"\0",0},{0,"\0",0},{0,"\0",0}, {0,"\0",0},{0,"\0",0}, {0,"长城干红",50,300},{0,"喜力啤酒",51,20},{0,"人头马",52,500}, {0,"\0",0},{0,"\0",0},{0,"\0",0}, {0,"\0",0},{0,"\0",0},{0,"\0",0}}; InitList(&yuan,60); for(i=0;i<60;i++) InsertLastList(&yuan,100);//+rand()%50 printf("\n\n\n\n\n\n\n\n"); printf(" |--------------------------------------------------------|\n"); printf(" |---------------- 欢迎您开始点餐! -----------------|\n"); printf(" |--------------- ----------------------------------------|\n"); Sleep(2500); system("CLS"); diancai(a ,cs); /*点餐函数,开始点餐吧!*/ ycldayin(yuan,a); printf("\n\n\n\n"); printf(" |--------------------------------------------------------|\n"); printf(" |-------------- 欢迎再次点餐,祝您用餐愉快! ---------------|\n"); printf(" |--------------------------------------------------------|\n"); printf("\n\n\n\n\n\n"); return 0; } int CCustomer(struct Customer *cs) { printf("请您输入顾客的姓名\n"); scanf("%s",cs->name); printf("请您输入顾客的身份证号码(18位数字)\n"); scanf("%s",cs->ID); cs->pay = cs->change = cs->day = 0; return 9; } int FCustomer() { printf("该顾客退房成功!"); return 8; } int main() //程序入口从这里开始运行 { //system("color 3E"); char choice='1'; system("color 3E"); initial_room(); //初始化60个房间的信息,分三个等级 welcome(); //验证用户登陆,登陆成功显示欢迎信息 while(choice=='1') { enter(); //根据用户的选择执行不同的功能 printf("\n"); printf("继续使用本系统请按\"1\",退出请按\"2\"! "); fflush(stdin); scanf("%c",&choice); printf("\n"); } return 0; } //系统登陆界面*********************************************************************** int welcome() //验证用户登陆,登陆成功显示欢迎信息 { char name[10],code[20]; printf("请输入用户名和密码:\n"); printf("用户名:"); scanf("%s",name); // scanf("%s%s",name,code); printf("密码:"); scanf("%s",code); while((strcmp(name,"Joe")!=0)||(strcmp(code,"Mercy")!=0)) { printf("用户名或密码输入有误,请重新输入!\n"); scanf("%s%s",name,code); } printf("\n"); printf("\n"); printf(" ▲***************************▲\n"); printf(" △ 欢迎使用酒店管理系统! △\n"); printf(" ▲***************************▲\n"); printf("\n"); return 7; } //系统入口*************************************************************************** int enter() { int kind_of_service; printf("请选择服务类别:入住、退房还是查询? \n"); printf("1->入住 2->退房 3->查询 4->点菜 "); scanf("%d",&kind_of_service); if((kind_of_service>4) || (kind_of_service<1)) { printf("您的输入有误,请重试!\n"); scanf("%d",&kind_of_service); } else { switch(kind_of_service) { case 1: check_in(); break; case 2: check_out(); break; case 3: inquire(); break; case 4: diancai1(); break; } } return 6; } //入住登记*************************************************************************** int check_in() { int pay; { int room_standard,day; customer[i] = (struct Customer*)malloc(sizeof(struct Customer)); CCustomer(customer[i]); printf("请您选择预定房间的标准:\n"); printf("1.单人间/天150元\n2.双人间/天200元\n3.标准间/天300元\n"); scanf("%d",&room_standard); printf("请输入住宿天数\n"); scanf("%d",&day); set_day(customer[i],day); switch(room_standard) { int n; case 1: pay=day*150; //set_pay(customer[i],pay); printf("请收房费 %d元整!\n",pay); for(n=0; n<20; n++) { if(room[n].state==0) { printf("入住房间号码为: %d\n",room[n].number); room[n].state=2; set_room_number(customer[i],room[n].number); break; } } break; case 2: pay=day*200; printf("请收房费 %d元整!\n",pay); for(n=20; n<40; n++) { if(room[n].state==0) { printf("入住房间号码为: %d\n",room[n].number); room[n].state=2; set_room_number(customer[i],room[n].number); break; } } break; case 3: pay=day*300; printf("请收房费 %d元整!\n",pay); for(n=40; n<60; n++) { if(room[n].state==0) { printf("入住房间号码为: %d\n",room[n].number); room[n].state=2; set_room_number(customer[i],room[n].number); break; } } break; } i++; } return 4; } //退房结算*************************************************************************** int check_out() { char name2[13],id2[19]; int standard,j,room_number,day1,day2,day; printf("请输入要退房的顾客姓名和身份证号码:\n"); scanf("%s%s",name2,id2); printf("请输入该顾客实住天数:\n"); scanf("%d",&day2); for(j=0; j<i; j++) { if((strcmp(get_name(customer[j]),name2)==0)&&(strcmp(get_ID(customer[j]),id2)==0)) { char account; room_number=get_room_number(customer[j]); standard=room_number/100; day1=get_day(customer[j]); day=day1-day2; switch(standard) { case 1: printf("顾客的房间号是%d :为单人间,每天150元\n",room_number); printf("实际住房消费 %d元整!\n",day2*150); printf("\n"); if(day2*150+caijia<pay) printf("请退给该顾客 %d 元整!\n",day*150); if(day2*150+caijia>pay) printf("请补收该顾客住房费 %d 元整!\n",day2*150+caijia-pay); printf("用餐费用为:%d\n",caijia); printf("消费总钱数为%d\n",day2*150+caijia); break; case 2: printf("顾客的房间号是%d :为双人间,每天200元%d\n",room_number); printf("实际住房消费 %d元整!\n",day2*200); printf("\n"); if(day2*200+caijia<pay) printf("请退给该顾客 %d 元整!\n",day*150); if(day2*200+caijia>pay) printf("请补收该顾客住房费 %d 元整!\n",day2*200+caijia-pay); printf("用餐费用为:%d\n",caijia); printf("消费总钱数为%d\n",day2*200+caijia); break; case 3: printf("顾客的房间号是%d :为标准间,每天300元%d\n"); printf("实际住房消费 %d元整!\n",day2*300); printf("\n"); if(day2*300+caijia<pay) printf("请退给该顾客 %d 元整!\n",day*300); if(day2*150+caijia>pay) printf("请补收该顾客住房费 %d 元整!\n",day2*300+caijia-pay); printf("用餐费用为:%d\n",caijia); printf("消费总钱数为%d\n",day2*300+caijia); break; } //printf("用餐费用为:%d\n",caijia); //printf("实际应收总价为") printf("退房核算清楚,请按1: "); fflush(stdin); scanf("%c",&account); if(account=='1') { int k; for(k=0; k<80; k++) { if(room[k].number==get_room_number(customer[j])) room[k].state=0; } i--; for(; j<i; j++) { customer[j]=customer[j+1]; } free(customer[i]); FCustomer(); } } } return 3; } //信息查询*************************************************************************** int inquire() { char inquire_choice; printf("房间信息查询请按1, 顾客信息查询请按2: "); fflush(stdin); scanf("%c",&inquire_choice); if(inquire_choice=='1') { int j,k=0; printf("\n"); printf("下列房间没人入住:\n"); for(j=0; j<60; j++) { if(room[j].state==0) { if(k%10==0) printf("\n"); printf("%d\t",room[j].number); k++; } } printf("\n"); printf("\n"); k=0; printf("\n"); printf("\n"); printf("下列房间有人入住:\n"); for(j=0; j<60; j++) { if(room[j].state==2) { if(k%10==0) printf("\n"); printf("%d\t",room[j].number); k++; } } printf("\n"); printf("\n"); } else if(inquire_choice=='2') { char inquire_choice; int j; printf("按姓名查询请按1, 按身份证查询请按2: \n"); fflush(stdin); scanf("%c",&inquire_choice); if(inquire_choice=='1') { char name3[13]; printf("请输入顾客的姓名: \n"); scanf("%s",name3); for(j=0; j<i; j++) { if(strcmp(get_name(customer[j]),name3)==0) { printf("%s的住房信息如下:\n",name3); printf("\t房间号为: %d\n",get_room_number(customer[j])); } } } if(inquire_choice=='2') { char id3[19]; int j; printf("请输入顾客的身份证: \n"); scanf("%s",id3); for(j=0; j<i; j++) { if(strcmp(get_ID(customer[j]),id3)==0) { printf("%s的住房信息如下:\n",get_name(customer[j])); printf("\t房间号为: %d\n",get_room_number(customer[j])); } } } } return 2; } //房间信息初始化********************************************************************* int initial_room() //对60个房间进行初始化,分3个等级 { int j,k=101; for(j=0; j<20; j++) { room[j].number=k++; room[j].rank=1; room[j].price=150; room[j].state=0; } k=201; for(j=20; j<40; j++) { room[j].number=k++; room[j].rank=2; room[j].price=200; room[j].state=0; } k=301; for(j=40; j<60; j++) { room[j].number=k++; room[j].rank=3; room[j].price=300; room[j].state=0; } return 1; } ``` ```

easyX和vs打字游戏,为何第二关输入的字母显示是空格及如何按ese返回主菜单

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include<graphics.h> //图形库 需要额外安装 #include <conio.h> #include <time.h> #include <windows.h> #include <string.h> #include <stdlib.h> #include <algorithm> #pragma comment(lib,"WinMM.Lib") #define _CRT_SECURE_NO_WARNINGS MOUSEMSG m; IMAGE background; IMAGE star[2]; int right = 0; int wrong = 0; char target; int x, y; struct letter//第一关字母结构体 { int x; int y; TCHAR target;//字符 }; struct letter array[5];//每次出现五个字母 struct TARGET//第二关单词结构体 { int x; int y; TCHAR str[20]; }; struct USERKEY//第二关保存用户输入得字母 { int x; int y; TCHAR str[20]; }userkey = { 100, 370, L" " }; void outtextxy_int(int x, int y, const char* format, int num)//输出整数 { char str[20] = " "; sprintf_s(str, format, num); outtextxy(x, y, TCHAR(str)); } void outtextxy_double(int x, int y, const char* format, double num)//输出浮点数 { char str[20] = " "; sprintf_s(str, format, num); outtextxy(x, y, TCHAR(str)); } void loadResource()//加载资源,把文字给图片 { loadimage(&background, L"键盘背景4.jpg", 1000, 650); loadimage(star + 0, L"星星掩码图.jpg", 80, 80); loadimage(star + 1, L"星星背景图.jpg", 80, 80); } //输出带星星的字母 void outtextimage(int x, int y, char target) { setbkmode(TRANSPARENT); putimage(x, y, star + 0, SRCAND); putimage(x, y, star + 1, SRCPAINT); settextstyle(25, 0, _T("宋体")); outtextxy(x + 35, y + 32, target); } //初始化五个坐标 void initArraychar(struct letter array[], int curPos) { //srand((unsigned int)time(NULL)); while (array[curPos].target == NULL || array[curPos].target == array[(curPos + 1) % 5].target || array[curPos].target == array[(curPos + 2) % 5].target || array[curPos].target == array[(curPos + 3) % 5].target || array[curPos].target == array[(curPos + 4) % 5].target) { array[curPos].target = rand() % 26 + 65; } while (array[curPos].x == array[(curPos + 1)].x || array[curPos].x == array[(curPos + 2)].x || array[curPos].x == array[(curPos + 3)].x || array[curPos].x == array[(curPos + 4)].x) { array[curPos].x = rand() % 800; } array[curPos].y = rand() % 80 - 100; } void Pause()//按空格键暂停 { IMAGE img; //准备图片 loadimage(&img, L"f.jpg", 1000, 650); //加载图片 L"背景.jpg"是图片的相对路径,也可以使用绝对路径 putimage(0, 0, &img); //在指定位置贴图 前面的(0,0)是坐标 后面的&img是要贴的图片 setfillcolor(COLORREF RGB(240, 230, 140)); fillrectangle(750, 130, 950, 190); fillrectangle(750, 210, 950, 270); TCHAR ch[] = _T("SNAP____"); settextstyle(35, 0, ch); settextcolor(COLORREF RGB(30, 144, 255)); TCHAR begin[] = _T("继续游戏"); TCHAR go[] = _T("返回主菜单"); setbkmode(TRANSPARENT); outtextxy(750 + 10, 130 + 10, begin); outtextxy(750 + 10, 210 + 10, go); MOUSEMSG m; while (1) { m = GetMouseMsg(); if (m.x >= 750 && m.x <= 930 && m.y >= 130 && m.y <= 190)//开始游戏 { setlinecolor(RED); rectangle(750, 130, 930, 190); if (m.uMsg == WM_LBUTTONDOWN) { break; } } else if (m.x >= 750 && m.x <= 930 && m.y >= 210 && m.y <= 270)//退出游戏 { setlinecolor(RED); rectangle(750, 210, 930, 270); if (m.uMsg == WM_LBUTTONDOWN) { exit(0); } } else { setlinecolor(WHITE); rectangle(750, 130, 930, 190); rectangle(750, 210, 930, 270); } } } //开始画键盘 void keyboard() { IMAGE img; //准备图片 loadimage(&img, L"键盘背景4.jpg", 1000, 650); //加载图片 L"背景.jpg"是图片的相对路径,也可以使用绝对路径 setbkmode(TRANSPARENT); putimage(0, 0, &img); //在指定位置贴图 前面的(0,0)是坐标 后面的&img是要贴的图片 int i, j, k, m, n; char one[] = { 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', 'P' };//第一行 char two[] = { 'A', 'S', 'D', 'F', 'G', 'H', 'J', 'K', 'L' };//第二行 char three[] = { 'Z', 'X', 'C', 'V', 'B', 'N', 'M' }; char four[] = { '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', '+' }; char five[] = { '`', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', '-', '=' }; char oneend[] = { '{', '}', '|' }; char oneend1[] = { '[', ']', '\\' }; char three1[] = { ':', '"' }; char three2[] = { ';', '\'' }; char h1[] = { '<', '>', '?' }; char h2[] = { ',', '.', '/' }; setcolor(WHITE); rectangle(220 - 100, 600 - 50 - 100, 290 - 100, 640 - 50 - 100); //Tab(220,550),(290,590) line(220 - 100, 600 - 150, 220 - 3 - 100, 603 - 150); line(220 - 3 - 100, 603 - 150, 220 - 100 - 3, 643 - 150); line(220 - 100, 640 - 150, 220 - 3 - 100, 643 - 150); line(290 - 100, 640 - 150, 293 - 100, 643 - 150); line(220 - 3 - 100, 643 - 150, 293 - 100, 643 - 150); line(290 - 100, 600 - 150, 293 - 100, 603 - 150); line(293 - 100, 603 - 150, 293 - 100, 643 - 150); TCHAR ch[] = _T("Arial"); settextstyle(20, 0, ch); TCHAR tab[] = _T("Tab"); outtextxy(230 - 100, 610 - 150, tab); rectangle(220 - 100, 650 - 150, 300 - 100, 690 - 150); //CapsLock (220,600),(300,640) line(220 - 100, 650 - 150, 220 - 3 - 100, 653 - 150); line(220 - 3 - 100, 653 - 150, 220 - 3 - 100, 693 - 150); line(220 - 100, 690 - 150, 220 - 3 - 100, 693 - 150); line(300 - 100, 690 - 150, 303 - 100, 693 - 150); line(220 - 3 - 100, 693 - 150, 303 - 100, 693 - 150); line(300 - 100, 650 - 150, 303 - 100, 653 - 150); line(303 - 100, 653 - 150, 303 - 100, 693 - 150); settextstyle(17, 0, ch); TCHAR CapsLock[] = _T("CapsLock"); outtextxy(230 - 100, 660 - 150, CapsLock); rectangle(870 - 100, 550 - 150, 940 - 100, 590 - 150); //Backspace (870,500),(940,540) line(870 - 100, 550 - 150, 870 - 3 - 100, 553 - 150); line(870 - 3 - 100, 553 - 150, 870 - 3 - 100, 593 - 150); line(870 - 100, 590 - 150, 870 - 3 - 100, 593 - 150); line(940 - 100, 590 - 150, 943 - 100, 593 - 150); line(870 - 3 - 100, 593 - 150, 943 - 100, 593 - 150); line(940 - 100, 550 - 150, 943 - 100, 553 - 150); line(943 - 100, 553 - 150, 943 - 100, 593 - 150); settextstyle(16, 0, ch); TCHAR Backspace[] = _T("Backspace"); outtextxy(875 - 100, 560 - 150, Backspace); rectangle(220 - 100, 700 - 150, 330 - 100, 740 - 150); //Shift (220,650),(330,690) line(220 - 100, 700 - 150, 220 - 100 - 3, 703 - 150); line(220 - 3 - 100, 703 - 150, 220 - 3 - 100, 743 - 150); line(220 - 100, 740 - 150, 220 - 3 - 100, 743 - 150); line(330 - 100, 740 - 150, 333 - 100, 743 - 150); line(220 - 3 - 100, 743 - 150, 333 - 100, 743 - 150); line(330 - 100, 700 - 150, 333 - 100, 703 - 150); line(333 - 100, 703 - 150, 333 - 100, 743 - 150); settextstyle(20, 0, ch); TCHAR Shift[] = _T("Shift"); outtextxy(230 - 100, 710 - 150, Shift); for (i = 220 - 100; i < 860 - 100; i = i + 50) // 键盘第零行13个键 { rectangle(i, 550 - 150, i + 40, 590 - 150); //键盘第一个字母坐标(220,500),(260,540) line(i, 550 - 150, i - 3, 553 - 150); line(i - 3, 553 - 150, i - 3, 593 - 150); line(i, 590 - 150, i - 3, 593 - 150); line(i + 40, 590 - 150, i + 43, 593 - 150); line(i - 3, 593 - 150, i + 43, 593 - 150); line(i + 40, 550 - 150, i + 43, 553 - 150); line(i + 43, 553 - 150, i + 43, 593 - 150); settextstyle(10, 0, ch); k = (i - 220 + 100) / 50; outtextxy(i + 5, 555 - 150, four[k]); settextstyle(16, 0, ch); outtextxy(i + 20, 570 - 150, five[k]); } for (i = 300 - 100; i < 800 - 100; i = i + 50) // 键盘第一行10个键 { rectangle(i, 600 - 150, i + 40, 640 - 150); //键盘第一个字母坐标(300,550),(340,590) line(i, 600 - 150, i - 3, 603 - 150); line(i - 3, 603 - 150, i - 3, 643 - 150); line(i, 640 - 150, i - 3, 643 - 150); line(i + 40, 640 - 150, i + 43, 643 - 150); line(i - 3, 643 - 150, i + 43, 643 - 150); line(i + 40, 600 - 150, i + 43, 603 - 150); line(i + 43, 603 - 150, i + 43, 643 - 150); TCHAR ch[] = _T("Arial"); settextstyle(20, 0, ch); k = (i - 300 + 100) / 50; outtextxy(i + 10, 610 - 150, one[k]); } for (i = 800 - 100; i < 940 - 100; i = i + 50) { rectangle(i, 600 - 150, i + 40, 640 - 150); //键盘第一个字母坐标(800,550),(850,590) line(i, 600 - 150, i - 3, 603 - 150); line(i - 3, 603 - 150, i - 3, 643 - 150); line(i, 640 - 150, i - 3, 643 - 150); line(i + 40, 640 - 150, i + 43, 643 - 150); line(i - 3, 643 - 150, i + 43, 643 - 150); line(i + 40, 600 - 150, i + 43, 603 - 150); line(i + 43, 603 - 150, i + 43, 643 - 150); settextstyle(15, 0, ch); k = (i - 800 + 100) / 50; outtextxy(i + 5, 605 - 150, oneend[k]); outtextxy(i + 20, 620 - 150, oneend1[k]); } for (j = 310 - 100; j < 760 - 100; j = j + 50) { rectangle(j, 650 - 150, j + 40, 690 - 150); //键盘第一个字母坐标(310,600),(350,640) line(j, 650 - 150, j - 3, 653 - 150); line(j - 3, 653 - 150, j - 3, 693 - 150); line(j, 690 - 150, j - 3, 693 - 150); line(j + 40, 690 - 150, j + 43, 693 - 150); line(j - 3, 693 - 150, j + 43, 693 - 150); line(j + 40, 650 - 150, j + 43, 653 - 150); line(j + 43, 653 - 150, j + 43, 693 - 150); TCHAR ch[] = _T("Arial"); settextstyle(20, 0, ch); k = (j - 310 + 100) / 50; outtextxy(j + 10, 660 - 150, two[k]); } for (j = 760 - 100; j < 850 - 100; j = j + 50) { // 310,600 350,640 rectangle(j, 650 - 150, j + 40, 690 - 150); //键盘第一个字母坐标(760,600),(800,640) line(j, 650 - 150, j - 3, 653 - 150); line(j - 3, 653 - 150, j - 3, 693 - 150); line(j, 690 - 150, j - 3, 693 - 150); line(j + 40, 690 - 150, j + 43, 693 - 150); line(j - 3, 693 - 150, j + 43, 693 - 150); line(j + 40, 650 - 150, j + 43, 653 - 150); line(j + 43, 653 - 150, j + 43, 693 - 150); settextstyle(20, 0, ch); k = (j - 760 + 100) / 50; outtextxy(j + 7, 655 - 150, three1[k]); outtextxy(j + 20, 669 - 150, three2[k]); } rectangle(860 - 100, 650 - 150, 940 - 100, 690 - 150); //Enter(860,600),(940,640) line(860 - 100, 650 - 150, 860 - 3 - 100, 653 - 150); line(860 - 3 - 100, 653 - 150, 860 - 3 - 100, 693 - 150); line(860 - 100, 690 - 150, 860 - 3 - 100, 693 - 150); line(940 - 100, 690 - 150, 943 - 100, 693 - 150); line(860 - 3 - 100, 693 - 150, 943 - 100, 693 - 150); line(940 - 100, 650 - 150, 943 - 100, 653 - 150); line(943 - 100, 653 - 150, 943 - 100, 693 - 150); settextstyle(20, 0, ch); TCHAR Enter[] = _T("Enter"); settextstyle(20, 0, ch); outtextxy(870 - 100, 660 - 150, Enter); for (m = 340 - 100; m < 690 - 100; m = m + 50) { rectangle(m, 700 - 150, m + 40, 740 - 150); //键盘第一个字母坐标(340,650),(380,690) line(m, 700 - 150, m - 3, 703 - 150); line(m - 3, 703 - 150, m - 3, 743 - 150); line(m, 740 - 150, m - 3, 743 - 150); line(m + 40, 740 - 150, m + 43, 743 - 150); line(m - 3, 743 - 150, m + 43, 743 - 150); line(m + 40, 700 - 150, m + 43, 703 - 150); line(m + 43, 703 - 150, m + 43, 743 - 150); TCHAR ch[] = _T("Arial"); settextstyle(20, 0, ch); k = (m - 310 + 100) / 50; outtextxy(m + 10, 710 - 150, three[k]); } for (m = 690 - 100; m < 830 - 100; m = m + 50) { rectangle(m, 700 - 150, m + 40, 740 - 150); //(690,650),(830,690) line(m, 700 - 150, m - 3, 703 - 150); line(m - 3, 703 - 150, m - 3, 743 - 150); line(m, 740 - 150, m - 3, 743 - 150); line(m + 40, 740 - 150, m + 43, 743 - 150); line(m - 3, 743 - 150, m + 43, 743 - 150); line(m + 40, 700 - 150, m + 43, 703 - 150); line(m + 43, 703 - 150, m + 43, 743 - 150); settextstyle(20, 0, ch); k = (m - 690 + 100) / 50; outtextxy(m + 5, 706 - 150, h1[k]); outtextxy(m + 23, 717 - 150, h2[k]); } rectangle(840 - 100, 700 - 150, 940 - 100, 740 - 150); // Shift(840,650),(940,690) line(840 - 100, 700 - 150, 840 - 3 - 100, 703 - 150); line(840 - 3 - 100, 703 - 150, 840 - 3 - 100, 743 - 150); line(840 - 100, 740 - 150, 840 - 3 - 100, 743 - 150); line(940 - 100, 740 - 150, 943 - 100, 743 - 150); line(840 - 3 - 100, 743 - 150, 943 - 100, 743 - 150); line(940 - 100, 700 - 150, 943 - 100, 703 - 150); line(943 - 100, 703 - 150, 943 - 100, 743 - 150); settextstyle(20, 0, ch); outtextxy(850 - 100, 710 - 150, Shift); rectangle(420 - 100, 700 - 100, 690 - 100, 740 - 100);//空格键 line(420 - 100, 700 - 100, 420 - 3 - 100, 700 + 3 - 100); line(420 - 3 - 100, 700 + 3 - 100, 420 - 3 - 100, 740 + 3 - 100); line(420 - 3 - 100, 740 + 3 - 100, 420 - 100, 740 - 100); line(420 - 3 - 100, 740 + 3 - 100, 690 + 3 - 100, 740 + 3 - 100); line(690 + 3 - 100, 740 + 3 - 100, 690 - 100, 740 - 100); line(690 - 100, 700 - 100, 690 + 3 - 100, 700 + 3 - 100); line(690 + 3 - 100, 700 + 3 - 100, 690 + 3 - 100, 740 + 3 - 100); for (m = 220 - 100; m < 420 - 100; m = m + 50)//空格键左边 { rectangle(m, 700 - 100, m + 40, 740 - 100);//ctrl line(m, 700 - 100, m - 3, 700 + 3 - 100); line(m - 3, 700 + 3 - 100, m - 3, 740 + 3 - 100); line(m - 3, 740 + 3 - 100, m, 740 - 100); line(m - 3, 740 + 3 - 100, m + 40 + 3, 740 + 3 - 100); line(m + 40, 740 - 100, m + 40 + 3, 743 - 100); line(m + 40, 700 - 100, m + 40 + 3, 703 - 100); line(m + 40 + 3, 703 - 100, m + 40 + 3, 743 - 100); } for (n = 700 - 100; n < 950 - 100; n = n + 50) { rectangle(n, 740 - 100, n + 40, 700 - 100);//右箭头键 line(n, 700 - 100, n - 3, 703 - 100); line(n - 3, 703 - 100, n - 3, 743 - 100); line(n - 3, 743 - 100, n + 40 + 3, 743 - 100); line(n - 3, 743 - 100, n, 740 - 100); line(n + 40, 700 - 100, n + 43, 703 - 100); line(n + 43, 703 - 100, n + 43, 743 - 100); line(n + 40, 740 - 100, n + 43, 743 - 100); } settextstyle(17, 0, ch); TCHAR Ctrl[] = _T("Ctrl"); TCHAR Fn[] = _T("Fn"); TCHAR Win[] = _T("Win"); TCHAR Alt[] = _T("Alt"); TCHAR Home[] = _T("Hom"); TCHAR End[] = _T("End"); TCHAR Up[] = _T("Up"); outtextxy(130, 610, Ctrl); outtextxy(180, 610, Fn); outtextxy(230, 610, Win); outtextxy(280, 610, Alt); outtextxy(810, 610, End); outtextxy(760, 610, Up); outtextxy(705, 610, Home); outtextxy(660, 610, Ctrl); outtextxy(610, 610, Alt); setfillcolor(COLORREF RGB(240, 230, 140)); fillrectangle(30, 30, 240, 80); TCHAR pause[] = _T("退出游戏请按Ese"); settextstyle(25, 0, _T("宋体")); setbkmode(TRANSPARENT); outtextxy(30,45, pause); //暂停判断 } //开始菜单 void beginning() { IMAGE img; //准备图片 loadimage(&img, L"欢迎界面3.jpg", 1000, 650); //加载图片 L"背景.jpg"是图片的相对路径,也可以使用绝对路径 putimage(0, 0, &img); //在指定位置贴图 前面的(0,0)是坐标 后面的&img是要贴的图片 //cleardevice(); setfillcolor(COLORREF RGB(240, 230, 140)); fillrectangle(750, 130, 930, 190); fillrectangle(750, 210, 930, 270); TCHAR ch[] = _T("SNAP____"); settextstyle(40, 0, ch); settextcolor(COLORREF RGB(30, 144, 255)); TCHAR begin[] = _T("开始游戏"); TCHAR go[] = _T("退出游戏"); setbkmode(TRANSPARENT); outtextxy(750 + 10, 130 + 10, begin); outtextxy(750 + 10, 210 + 10, go); } //开始菜单鼠标交互 void mouse() { initgraph(1000, 650); beginning(); MOUSEMSG m; while (1) { m = GetMouseMsg(); if (m.x >= 750 && m.x <= 930 && m.y >= 130 && m.y <= 190)//开始游戏 { setlinecolor(RED); rectangle(750, 130, 930, 190); if (m.uMsg == WM_LBUTTONDOWN) { break; } } else if (m.x >= 750 && m.x <= 930 && m.y >= 210 && m.y <= 270)//退出游戏 { setlinecolor(RED); rectangle(750, 210, 930, 270); if (m.uMsg == WM_LBUTTONDOWN) { exit(0); } } else { setlinecolor(WHITE); rectangle(750, 130, 930, 190); rectangle(750, 210, 930, 270); } } closegraph(); } //关卡设置 void level1() { mouse();//鼠标交会函数关闭了窗口 initgraph(1000, 650); IMAGE img; //准备图片 loadimage(&img, L"关卡选择.jpg", 1000, 650); //加载图片 L"背景.jpg"是图片的相对路径 putimage(0, 0, &img); //在指定位置贴图 前面的(0,0)是坐标 后面的&img是要贴的图片 setfillcolor(COLORREF RGB(255, 192, 203)); fillrectangle(365, 230, 675, 280); fillrectangle(365, 300, 675, 350); fillrectangle(365, 370, 675, 420); TCHAR ch[] = _T("SNAP____"); settextstyle(30, 0, ch); settextcolor(COLORREF RGB(30, 144, 255)); TCHAR first[] = _T("模式一:轻轻松松"); TCHAR second[] = _T("模式二:小菜一碟"); TCHAR go[] = _T("退出游戏"); setbkmode(TRANSPARENT); outtextxy(415 - 50 + 30, 230 + 10, first); outtextxy(415 - 50 + 30, 300 + 10, second); outtextxy(415 - 50 + 10 + 30 + 50, 370 + 10, go); MOUSEMSG m; while (1) { m = GetMouseMsg(); if (m.x >= 365 && m.x <= 675 && m.y >= 230 && m.y <= 280)//开始游戏 { setlinecolor(RED); rectangle(365, 230, 675, 280); if (m.uMsg == WM_LBUTTONDOWN) { break; } } else if (m.x >= 365 && m.x <= 675 && m.y >= 300 && m.y <= 350)//退出游戏 { setlinecolor(RED); rectangle(365, 300, 675, 350); if (m.uMsg == WM_LBUTTONDOWN) { break; } } else if (m.x >= 365 && m.x <= 675 && m.y >= 370 && m.y <= 420)//退出游戏 { setlinecolor(RED); rectangle(365, 370, 675, 420); if (m.uMsg == WM_LBUTTONDOWN) { exit(0); } } else { setlinecolor(WHITE); rectangle(365, 230, 675, 280); rectangle(365, 300, 675, 350); rectangle(365, 370, 675, 420); } } closegraph(); } //第一关游戏界面 void gamefirst() { char s[10] = { 0 }; char f[10] = { 0 }; int score = 0; int wrong = 0; //level();//也关闭了屏幕 initgraph(1000, 650); keyboard(); loadResource(); //outtextimage(200, 200, 'S'); for (int i = 0; i < 5; i++) { initArraychar(array, i); } initgraph(1000, 650);//要去掉吗? while (1)//文字下降 { BeginBatchDraw(); keyboard(); for (int i = 0; i < 5; i++) { array[i].y += 10; if (array[i].y >= 400) { initArraychar(array, i); score -= 10; wrong++; } } for (int i = 0; i < 5; i++) { outtextimage(array[i].x, array[i].y, array[i].target); } if (_kbhit()) { char userkey = _getch();//接收用户输入 for (int i = 0; i < 5; i++) { if (array[i].target == userkey || array[i].target == userkey - ('a' - 'A')) { score += 10; initArraychar(array, i); break; } } if (userkey == 27) { break; } } Sleep(100); EndBatchDraw(); } //closegraph(); //initgraph(1000, 650); beginning(); Sleep(100); } void highlight(char c)//高亮 { keyboard(); if (_kbhit()) { char c = _getch();//接收用户输入 fillrectangle(x, y, x + 40, y + 40); Sleep(20); clearrectangle(x, y, x + 40, y + 40); } if (c >= 'A' && c <= 'Z') { c = c + 32; if (c >= 'a' && c <= 'z') //若为小写 switch (c) { case 'q': { fillrectangle(200, 450, 200 + 40, 450 + 40); Sleep(20); clearrectangle(200, 450, 200 + 40, 450 + 40); break; } case 'w': { fillrectangle(250, 450, 250 + 40, 450 + 40); Sleep(20); clearrectangle(250, 450, 250 + 40, 450 + 40); break; } case 'e': { fillrectangle(300, 450, 300 + 40, 450 + 40); Sleep(20); clearrectangle(300, 450, 300 + 40, 450 + 40); break; } case 'r': { fillrectangle(350, 450, 350 + 40, 450 + 40); Sleep(20); clearrectangle(350, 450, 350 + 40, 450 + 40); break; }//x = 350; y = 450; break; case 't': { fillrectangle(400, 450, 400 + 40, 450 + 40); Sleep(20); clearrectangle(400, 450, 400 + 40, 450 + 40); break; }//x = 400; y = 450; break; case 'y': { fillrectangle(450, 450, 450 + 40, 450 + 40); Sleep(20); clearrectangle(450, 450, 450 + 40, 450 + 40); break; }//x = 450; y = 450; break; case 'u': { fillrectangle(500, 450, 500 + 40, 450 + 40); Sleep(20); clearrectangle(500, 450, 500 + 40, 450 + 40); break; }//x = 500; y = 450; break; case 'i': { fillrectangle(550, 450, 550 + 40, 450 + 40); Sleep(20); clearrectangle(550, 450, 550 + 40, 450 + 40); break; }//x = 550; y = 450; break; case 'o': { fillrectangle(600, 450, 600 + 40, 450 + 40); Sleep(20); clearrectangle(600, 450, 600 + 40, 450 + 40); break; }//x = 600; y = 450; break; case 'p': { fillrectangle(650, 450, 650 + 40, 450 + 40); Sleep(20); clearrectangle(650, 450, 650 + 40, 450 + 40); break; }//x = 650; y = 450; break; //case '[':x = 700; y = 450; break; //case '{':x = 700; y = 450; break; //case ']':x = 750; y = 450; break; //case '}':x = 750; y = 450; break; //case '|':x = 800; y = 450; break; //case 'Cap':x = 120; y = 500; break; case 'a': { fillrectangle(210, 500, 210 + 40, 500 + 40); Sleep(20); clearrectangle(210, 500, 210 + 40, 500 + 40); break; }//x = 210; y = 500; break; case 's': { fillrectangle(260, 500, 260 + 40, 500 + 40); Sleep(20); clearrectangle(260, 500, 260 + 40, 500 + 40); break; }//x = 260; y = 500; break; case 'd': { fillrectangle(310, 500, 310 + 40, 500 + 40); Sleep(20); clearrectangle(310, 500, 310 + 40, 500 + 40); break; }//x = 310; y = 500; break; case 'f': { fillrectangle(360, 500, 360 + 40, 500 + 40); Sleep(20); clearrectangle(360, 500, 360 + 40, 500 + 40); break; }//x = 360; y = 500; break; case 'g': { fillrectangle(410, 500, 410 + 40, 500 + 40); Sleep(20); clearrectangle(410, 500, 410 + 40, 500 + 40); break; }//x = 410; y = 500; break; case 'h': { fillrectangle(460, 500, 460 + 40, 500 + 40); Sleep(20); clearrectangle(460, 500, 460 + 40, 500 + 40); break; }//x = 460; y = 500; break; case 'j': { fillrectangle(510, 500, 510 + 40, 500 + 40); Sleep(20); clearrectangle(510, 500, 510 + 40, 500 + 40); break; }//x = 510; y = 500; break; case 'k': { fillrectangle(560, 500, 560 + 40, 500 + 40); Sleep(20); clearrectangle(560, 500, 560 + 40, 500 + 40); break; }//x = 560; y = 500; break; case 'l': { fillrectangle(610, 500, 610 + 40, 500 + 40); Sleep(20); clearrectangle(610, 500, 610 + 40, 500 + 40); break; }//x = 610; y = 500; break; case 'z': { fillrectangle(240, 550, 240 + 40, 550 + 40); Sleep(20); clearrectangle(240, 550, 240 + 40, 550 + 40); break; }//x = 240; y = 550; break; case 'x': { fillrectangle(290, 550, 290 + 40, 550 + 40); Sleep(20); clearrectangle(290, 550, 290 + 40, 550 + 40); break; }//x = 290; y = 550; break; case 'c': { fillrectangle(340, 550, 340 + 40, 550 + 40); Sleep(20); clearrectangle(340, 550, 340 + 40, 550 + 40); break; }//x = 340; y = 550; break; case 'v': { fillrectangle(390, 550, 390 + 40, 550 + 40); Sleep(20); clearrectangle(390, 550, 390 + 40, 550 + 40); break; }//x = 390; y = 550; break; case 'b': { fillrectangle(440, 550, 440 + 40, 550 + 40); Sleep(20); clearrectangle(440, 550, 440 + 40, 550 + 40); break; }//x = 440; y = 550; break; case 'n': { fillrectangle(490, 550, 490 + 40, 550 + 40); Sleep(20); clearrectangle(490, 550, 490 + 40, 550 + 40); break; }//x = 490; y = 550; break; case 'm': { fillrectangle(540, 550, 540 + 40, 550 + 40); Sleep(20); clearrectangle(540, 550, 540 + 40, 550 + 40); break; } } } } void InitTarget(TARGET words[], int n)//随机产生三个单词 { settextstyle(20, 0, L"宋体"); TCHAR str[30][30] = { L"main", L"include", L"if", L"switch", L"break", L"char", L"void", L"continue", L"for", L"while", L"do", L"int", L"unsigned", L"struct", L"static", L"malloc", L"free", L"else", L"float", L"double", L"short", L"return", L"getchar", L"gets", L"include", L"realloc", L"pointer", L"default", L"long" }; //随机产生 wcscpy(words[n].str, str[rand() % 29]); //判断重复 while (words[n].str == words[(n + 1) % 3].str || words[n].str == words[(n + 2) % 3].str) { wcscpy(words[n].str, str[rand() % 29]); } words[n].x = rand() % (900); words[n].y = -20; } //设置分数 void drawscore() { settextcolor(RED); settextstyle(30, 0, L"宋体"); outtextxy(800, 50,L"正确数:"); outtextxy_int(900, 50, "%d", right); outtextxy(800, 100, L"失误数:"); outtextxy_int(900, 150, "%d", wrong); outtextxy(800, 150, L"正确率:"); if (right + wrong == 0) { outtextxy_double(900, 250, "%.2lf%%", 0.00); } else { double sum = (right +wrong); outtextxy_double(900, 250, "%.2lf%%", right/sum*100); } } void gamesecond()//第二关天降单词 { initgraph(1000, 650); keyboard(); drawscore(); struct TARGET words[3]; for (int n = 0; n < 3; n++) { InitTarget(words, n); words[n].y = -15 - n * 30; } int i=0; while (1) { //cleardevice(); BeginBatchDraw(); keyboard(); drawscore(); int flagerror = 0; for (int n = 0; n < 3; n++) { words[n].y += 2; if (words[n].y > 400-30)//碰线处理 { InitTarget(words, n); } } for (int n = 0; n < 3; n++)//字母下落 { settextcolor(RED); settextstyle(30, 0, _T("宋体")); outtextxy(words[n].x, words[n].y, LPCTSTR(words[n].str)); words[n].y += 2; } if (_kbhit()) { //字符串变成字符处理 char target;//接受用户按键 if (target = _getch() != '\r') { userkey.str[i++] = target; highlight(target); } else { for (i = 0; i < 3; i++) { if (wcscmp(userkey.str, words[i].str) == 0) { InitTarget(words, i); right++; flagerror = 1; } } if (flagerror == 0) { wrong++; } i = 0;//易错,要重新初始化 userkey.x = 100; memset(userkey.str, 0, 20);//防止覆盖 } } outtextxy(userkey.x, userkey.y, userkey.str); Sleep(50); EndBatchDraw(); } } void level() { mouse();//鼠标交会函数关闭了窗口 initgraph(1000, 650); IMAGE img; //准备图片 loadimage(&img, L"关卡选择.jpg", 1000, 650); //加载图片 L"背景.jpg"是图片的相对路径 putimage(0, 0, &img); //在指定位置贴图 前面的(0,0)是坐标 后面的&img是要贴的图片 setfillcolor(COLORREF RGB(255, 192, 203)); fillrectangle(365, 230, 675, 280); fillrectangle(365, 300, 675, 350); fillrectangle(365, 370, 675, 420); TCHAR ch[] = _T("SNAP____"); settextstyle(30, 0, ch); settextcolor(COLORREF RGB(30, 144, 255)); TCHAR first[] = _T("模式一:轻轻松松"); TCHAR second[] = _T("模式二:小菜一碟"); TCHAR go[] = _T("退出游戏"); setbkmode(TRANSPARENT); outtextxy(415 - 50 + 30, 230 + 10, first); outtextxy(415 - 50 + 30, 300 + 10, second); outtextxy(415 - 50 + 10 + 30 + 50, 370 + 10, go); MOUSEMSG m; while (1) { m = GetMouseMsg(); if (m.x >= 365 && m.x <= 675 && m.y >= 230 && m.y <= 280)//模式一 { setlinecolor(RED); rectangle(365, 230, 675, 280); if (m.uMsg == WM_LBUTTONDOWN) { gamefirst(); } } else if (m.x >= 365 && m.x <= 675 && m.y >= 300 && m.y <= 350)//模式二 { setlinecolor(RED); rectangle(365, 300, 675, 350); if (m.uMsg == WM_LBUTTONDOWN) { //break; gamesecond(); } } else if (m.x >= 365 && m.x <= 675 && m.y >= 370 && m.y <= 420)//退出游戏 { setlinecolor(RED); rectangle(365, 370, 675, 420); if (m.uMsg == WM_LBUTTONDOWN) { exit(0); } } else { setlinecolor(WHITE); rectangle(365, 230, 675, 280); rectangle(365, 300, 675, 350); rectangle(365, 370, 675, 420); } } closegraph(); } //退出界面 void goodbye(time_t end, time_t start, int flag) { time_t timep; int i = end - start; char a[10] = { '\0' }; TCHAR s[100] = { 0 }; char ff[10] = { 0 }; TCHAR fff[100] = { 0 }; cleardevice(); setcolor(RED); IMAGE img; loadimage(&img, L"结束.jpg", 1000, 650); putimage(0, 0, &img); TCHAR style[] = _T("黑体"); settextstyle(40, 0, style); TCHAR ch[] = _T("游戏时间:"); outtextxy(104, 180, ch); TCHAR chf[] = _T("失败次数:"); outtextxy(654, 180, chf); sprintf_s(a, "%d", i); sprintf_s(ff, "%d", flag); #ifdef UNICODE MultiByteToWideChar(CP_ACP, 0, a, -1, s, 100); #else strcpy(a, s); #endif #ifdef UNICODE MultiByteToWideChar(CP_ACP, 0, ff, -1, fff, 100); #else strcpy(ff, fff); #endif outtextxy(200, 220, s); outtextxy(950, 220, fff); _getch(); } int main() { srand((unsigned)time(NULL)); initgraph(1000, 650);//新建窗口 setbkcolor(COLORREF RGB(255, 192, 203)); //cleardevice(); beginning(); level(); //gamefirst(); //keyboard(); //gamesecond(); drawscore(); _getch(); // 按任意键继续,千万不要删!!!!!!! closegraph(); // 关闭绘图窗口 return 0; } ``` ``` ``` ```

在中国程序员是青春饭吗?

今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...

程序员请照顾好自己,周末病魔差点一套带走我。

程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。

C++(数据结构与算法)78:---分而治之

一、分而治之的思想 分而治之方法与软件设计的模块化方法非常相似 分而治之通常不用于解决问题的小实例,而要解决一个问题的大实例。一般步骤为: ①把一个大实例分为两个或多个更小的实例 ②分别解决每个小实例 ③把这些小实例的解组合成原始大实例的解 二、实际应用之找出假币 问题描述 一个袋子有16个硬币,其中只有一个是假币,这个假币比其他的真币重量轻(其他所有真币的重量都是相同的)...

springboot+jwt实现token登陆权限认证

一 前言 此篇文章的内容也是学习不久,终于到周末有时间码一篇文章分享知识追寻者的粉丝们,学完本篇文章,读者将对token类的登陆认证流程有个全面的了解,可以动态搭建自己的登陆认证过程;对小项目而已是个轻量级的认证机制,符合开发需求;更多精彩原创内容关注公主号知识追寻者,读者的肯定,就是对作者的创作的最大支持; 二 jwt实现登陆认证流程 用户使用账号和面发出post请求 服务器接受到请求后使用私...

技术大佬:我去,你写的 switch 语句也太老土了吧

昨天早上通过远程的方式 review 了两名新来同事的代码,大部分代码都写得很漂亮,严谨的同时注释也很到位,这令我非常满意。但当我看到他们当中有一个人写的 switch 语句时,还是忍不住破口大骂:“我擦,小王,你丫写的 switch 语句也太老土了吧!” 来看看小王写的代码吧,看完不要骂我装逼啊。 private static String createPlayer(PlayerTypes p...

win10暴力查看wifi密码

刚才邻居打了个电话说:喂小灰,你家wifi的密码是多少,我怎么连不上了。 我。。。 我也忘了哎,就找到了一个好办法,分享给大家: 第一种情况:已经连接上的wifi,怎么知道密码? 打开:控制面板\网络和 Internet\网络连接 然后右击wifi连接的无线网卡,选择状态 然后像下图一样: 第二种情况:前提是我不知道啊,但是我以前知道密码。 此时可以利用dos命令了 1、利用netsh wlan...

女程序员,为什么比男程序员少???

昨天看到一档综艺节目,讨论了两个话题:(1)中国学生的数学成绩,平均下来看,会比国外好?为什么?(2)男生的数学成绩,平均下来看,会比女生好?为什么?同时,我又联想到了一个技术圈经常讨...

副业收入是我做程序媛的3倍,工作外的B面人生是怎样的?

提到“程序员”,多数人脑海里首先想到的大约是:为人木讷、薪水超高、工作枯燥…… 然而,当离开工作岗位,撕去层层标签,脱下“程序员”这身外套,有的人生动又有趣,马上展现出了完全不同的A/B面人生! 不论是简单的爱好,还是正经的副业,他们都干得同样出色。偶尔,还能和程序员的特质结合,产生奇妙的“化学反应”。 @Charlotte:平日素颜示人,周末美妆博主 大家都以为程序媛也个个不修边幅,但我们也许...

MySQL数据库面试题(2020最新版)

文章目录数据库基础知识为什么要使用数据库什么是SQL?什么是MySQL?数据库三大范式是什么mysql有关权限的表都有哪几个MySQL的binlog有有几种录入格式?分别有什么区别?数据类型mysql有哪些数据类型引擎MySQL存储引擎MyISAM与InnoDB区别MyISAM索引与InnoDB索引的区别?InnoDB引擎的4大特性存储引擎选择索引什么是索引?索引有哪些优缺点?索引使用场景(重点)...

如果你是老板,你会不会踢了这样的员工?

有个好朋友ZS,是技术总监,昨天问我:“有一个老下属,跟了我很多年,做事勤勤恳恳,主动性也很好。但随着公司的发展,他的进步速度,跟不上团队的步伐了,有点...

我入职阿里后,才知道原来简历这么写

私下里,有不少读者问我:“二哥,如何才能写出一份专业的技术简历呢?我总感觉自己写的简历太烂了,所以投了无数份,都石沉大海了。”说实话,我自己好多年没有写过简历了,但我认识的一个同行,他在阿里,给我说了一些他当年写简历的方法论,我感觉太牛逼了,实在是忍不住,就分享了出来,希望能够帮助到你。 01、简历的本质 作为简历的撰写者,你必须要搞清楚一点,简历的本质是什么,它就是为了来销售你的价值主张的。往深...

程序员写出这样的代码,能不挨骂吗?

当你换槽填坑时,面对一个新的环境。能够快速熟练,上手实现业务需求是关键。但是,哪些因素会影响你快速上手呢?是原有代码写的不够好?还是注释写的不够好?昨夜...

带了6个月的徒弟当了面试官,而身为高级工程师的我天天修Bug......

即将毕业的应届毕业生一枚,现在只拿到了两家offer,但最近听到一些消息,其中一个offer,我这个组据说客户很少,很有可能整组被裁掉。 想问大家: 如果我刚入职这个组就被裁了怎么办呢? 大家都是什么时候知道自己要被裁了的? 面试软技能指导: BQ/Project/Resume 试听内容: 除了刷题,还有哪些技能是拿到offer不可或缺的要素 如何提升面试软实力:简历, 行为面试,沟通能...

优雅的替换if-else语句

场景 日常开发,if-else语句写的不少吧??当逻辑分支非常多的时候,if-else套了一层又一层,虽然业务功能倒是实现了,但是看起来是真的很不优雅,尤其是对于我这种有强迫症的程序"猿",看到这么多if-else,脑袋瓜子就嗡嗡的,总想着解锁新姿势:干掉过多的if-else!!!本文将介绍三板斧手段: 优先判断条件,条件不满足的,逻辑及时中断返回; 采用策略模式+工厂模式; 结合注解,锦...

!大部分程序员只会写3年代码

如果世界上都是这种不思进取的软件公司,那别说大部分程序员只会写 3 年代码,恐怕就没有程序员这种职业。

离职半年了,老东家又发 offer,回不回?

有小伙伴问松哥这个问题,他在上海某公司,在离职了几个月后,前公司的领导联系到他,希望他能够返聘回去,他很纠结要不要回去? 俗话说好马不吃回头草,但是这个小伙伴既然感到纠结了,我觉得至少说明了两个问题:1.曾经的公司还不错;2.现在的日子也不是很如意。否则应该就不会纠结了。 老实说,松哥之前也有过类似的经历,今天就来和小伙伴们聊聊回头草到底吃不吃。 首先一个基本观点,就是离职了也没必要和老东家弄的苦...

2020阿里全球数学大赛:3万名高手、4道题、2天2夜未交卷

阿里巴巴全球数学竞赛( Alibaba Global Mathematics Competition)由马云发起,由中国科学技术协会、阿里巴巴基金会、阿里巴巴达摩院共同举办。大赛不设报名门槛,全世界爱好数学的人都可参与,不论是否出身数学专业、是否投身数学研究。 2020年阿里巴巴达摩院邀请北京大学、剑桥大学、浙江大学等高校的顶尖数学教师组建了出题组。中科院院士、美国艺术与科学院院士、北京国际数学...

为什么你不想学习?只想玩?人是如何一步一步废掉的

不知道是不是只有我这样子,还是你们也有过类似的经历。 上学的时候总有很多光辉历史,学年名列前茅,或者单科目大佬,但是虽然慢慢地长大了,你开始懈怠了,开始废掉了。。。 什么?你说不知道具体的情况是怎么样的? 我来告诉你: 你常常潜意识里或者心理觉得,自己真正的生活或者奋斗还没有开始。总是幻想着自己还拥有大把时间,还有无限的可能,自己还能逆风翻盘,只不是自己还没开始罢了,自己以后肯定会变得特别厉害...

男生更看重女生的身材脸蛋,还是思想?

往往,我们看不进去大段大段的逻辑。深刻的哲理,往往短而精悍,一阵见血。问:产品经理挺漂亮的,有点心动,但不知道合不合得来。男生更看重女生的身材脸蛋,还是...

为什么程序员做外包会被瞧不起?

二哥,有个事想询问下您的意见,您觉得应届生值得去外包吗?公司虽然挺大的,中xx,但待遇感觉挺低,马上要报到,挺纠结的。

当HR压你价,说你只值7K,你该怎么回答?

当HR压你价,说你只值7K时,你可以流畅地回答,记住,是流畅,不能犹豫。 礼貌地说:“7K是吗?了解了。嗯~其实我对贵司的面试官印象很好。只不过,现在我的手头上已经有一份11K的offer。来面试,主要也是自己对贵司挺有兴趣的,所以过来看看……”(未完) 这段话主要是陪HR互诈的同时,从公司兴趣,公司职员印象上,都给予对方正面的肯定,既能提升HR的好感度,又能让谈判气氛融洽,为后面的发挥留足空间。...

面试:第十六章:Java中级开发

HashMap底层实现原理,红黑树,B+树,B树的结构原理 Spring的AOP和IOC是什么?它们常见的使用场景有哪些?Spring事务,事务的属性,传播行为,数据库隔离级别 Spring和SpringMVC,MyBatis以及SpringBoot的注解分别有哪些?SpringMVC的工作原理,SpringBoot框架的优点,MyBatis框架的优点 SpringCould组件有哪些,他们...

早上躺尸,晚上干活:硅谷科技公司这么流行迟到?

硅谷科技公司上班时间OPEN早已不是什么新鲜事,早九晚五是常态,但有很多企业由于不打卡,员工们10点、11点才“姗姗来迟”的情况也屡见不鲜。 这种灵活的考勤制度为人羡慕,甚至近年来,国内某些互联网企业也纷纷效仿。不过,硅谷普遍弹性的上班制度是怎么由来的呢?这种“流行性迟到”真的有那么轻松、悠哉吗? 《动态规划专题班》 课程试听内容: 动态规划的解题要领 动态规划三大类 求最值/计数/可行性 常...

面试阿里p7,被按在地上摩擦,鬼知道我经历了什么?

面试阿里p7被问到的问题(当时我只知道第一个):@Conditional是做什么的?@Conditional多个条件是什么逻辑关系?条件判断在什么时候执...

Python爬虫,高清美图我全都要(彼岸桌面壁纸)

爬取彼岸桌面网站较为简单,用到了requests、lxml、Beautiful Soup4

无代码时代来临,程序员如何保住饭碗?

编程语言层出不穷,从最初的机器语言到如今2500种以上的高级语言,程序员们大呼“学到头秃”。程序员一边面临编程语言不断推陈出新,一边面临由于许多代码已存在,程序员编写新应用程序时存在重复“搬砖”的现象。 无代码/低代码编程应运而生。无代码/低代码是一种创建应用的方法,它可以让开发者使用最少的编码知识来快速开发应用程序。开发者通过图形界面中,可视化建模来组装和配置应用程序。这样一来,开发者直...

面试了一个 31 岁程序员,让我有所触动,30岁以上的程序员该何去何从?

最近面试了一个31岁8年经验的程序猿,让我有点感慨,大龄程序猿该何去何从。

大三实习生,字节跳动面经分享,已拿Offer

说实话,自己的算法,我一个不会,太难了吧

程序员垃圾简历长什么样?

已经连续五年参加大厂校招、社招的技术面试工作,简历看的不下于万份 这篇文章会用实例告诉你,什么是差的程序员简历! 疫情快要结束了,各个公司也都开始春招了,作为即将红遍大江南北的新晋UP主,那当然要为小伙伴们做点事(手动狗头)。 就在公众号里公开征简历,义务帮大家看,并一一点评。《启舰:春招在即,义务帮大家看看简历吧》 一石激起千层浪,三天收到两百多封简历。 花光了两个星期的所有空闲时...

Java岗开发3年,公司临时抽查算法,离职后这几题我记一辈子

前几天我们公司做了一件蠢事,非常非常愚蠢的事情。我原以为从学校出来之后,除了找工作有测试外,不会有任何与考试有关的事儿。 但是,天有不测风云,公司技术总监、人事总监两位大佬突然降临到我们事业线,叫上我老大,给我们组织了一场别开生面的“考试”。 那是一个风和日丽的下午,我翘着二郎腿,左手端着一杯卡布奇诺,右手抓着我的罗技鼠标,滚动着轮轴,穿梭在头条热点之间。 “淡黄的长裙~蓬松的头发...

大牛都会用的IDEA调试技巧!!!

导读 前天面试了一个985高校的实习生,问了他平时用什么开发工具,他想也没想的说IDEA,于是我抛砖引玉的问了一下IDEA的调试用过吧,你说说怎么设置断点...

都前后端分离了,咱就别做页面跳转了!统统 JSON 交互

文章目录1. 无状态登录1.1 什么是有状态1.2 什么是无状态1.3 如何实现无状态1.4 各自优缺点2. 登录交互2.1 前后端分离的数据交互2.2 登录成功2.3 登录失败3. 未认证处理方案4. 注销登录 这是本系列的第四篇,有小伙伴找不到之前文章,松哥给大家列一个索引出来: 挖一个大坑,Spring Security 开搞! 松哥手把手带你入门 Spring Security,别再问密...

面试官:你连SSO都不懂,就别来面试了

大厂竟然要考我SSO,卧槽。

终于,月薪过5万了!

来看几个问题想不想月薪超过5万?想不想进入公司架构组?想不想成为项目组的负责人?想不想成为spring的高手,超越99%的对手?那么本文内容是你必须要掌握的。本文主要详解bean的生命...

自从喜欢上了B站这12个UP主,我越来越觉得自己是个废柴了!

不怕告诉你,我自从喜欢上了这12个UP主,哔哩哔哩成为了我手机上最耗电的软件,几乎每天都会看,可是吧,看的越多,我就越觉得自己是个废柴,唉,老天不公啊,不信你看看…… 间接性踌躇满志,持续性混吃等死,都是因为你们……但是,自己的学习力在慢慢变强,这是不容忽视的,推荐给你们! 都说B站是个宝,可是有人不会挖啊,没事,今天咱挖好的送你一箩筐,首先啊,我在B站上最喜欢看这个家伙的视频了,为啥 ,咱撇...

代码注释如此沙雕,会玩还是你们程序员!

某站后端代码被“开源”,同时刷遍全网的,还有代码里的那些神注释。 我们这才知道,原来程序员个个都是段子手;这么多年来,我们也走过了他们的无数套路… 首先,产品经理,是永远永远吐槽不完的!网友的评论也非常扎心,说看这些代码就像在阅读程序员的日记,每一页都写满了对产品经理的恨。 然后,也要发出直击灵魂的质问:你是尊贵的付费大会员吗? 这不禁让人想起之前某音乐app的穷逼Vip,果然,穷逼在哪里都是...

立即提问
相关内容推荐