Windwos安裝Apache服務器軟件,進行測試。Localhost
將可執行程序xxx.exe改為xxx.cgi放到apache服務器上,通過浏覽器進行訪問。
#define _CRT_SECURE_NO_WARNINGS #include#include #include void main() { printf(Content-type:text/html ); printf(%s , getenv(QUERY_STRING));//打印環境變量 char szPost[256] = {0}; gets(szPost);//獲取輸入 printf(%s , szPost);//獲取輸入 //BBB=tasklist&AAA=%C7%EB%BD%F8 char *p = szPost + 4;//0,1,2,3 char *p1 = strchr(szPost, '&'); *p1 = ''; 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 == ' ') { printf( );//換行 } else { putchar(ch);//打印字符 } } }
#include#include //最寬基本基本成員,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 , &info11); printf(%p , &info11.sh1); printf(%p , &info11.sh); printf(%p , &info11.ch); getchar(); } void main1() { printf(%d, sizeof(struct info1)); system(pause); }
#define _CRT_SECURE_NO_WARNINGS #include#include #include 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( str1.p=%s, str1.p);//輸出結果 struct string str2; str2.length = str1.length; str2.p = str1.p; *(str1.p) = 'k';//淺拷貝,共享內存 printf( str2.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( str1.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( str2.p=%s, str2.p);//輸出結果 system(pause); }
//隊列.h
#include#include #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( ); if (myqueue->front == myqueue->rear) { printf( 你的腸胃為空); } 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( 腸胃為空,無法找到你要最先拉的屎); return -1; } else { return myqueue->data[myqueue->front];//返回第一個節點 } }
//main.c
#include#include #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#include #include //字符串封裝,需要庫函數 //不需要庫函數 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 != '')//字符串終止條件 { length++;//長度自增 p++;//指針不斷向前 } return length; } char *mystrcpy(char *dest, const char *source)//const限定不被意外修改 { if (dest == NULL || source == NULL) { return NULL;//為空沒有必要干活了 } char * destbak = dest; while (*source != '')//一直拷貝 { *dest = *source;//賦值字符 source++; dest++;//指針不斷向前,字符挨個賦值 } *dest = '';//結尾 return destbak;//返回地址 } char *mystrcat(char *dest, const char *source) { if (dest == NULL || source == NULL) { return NULL;//失敗 } else { char *destbak = dest;//保留地址 while (*dest != '') { dest++;//指針向前移動 } //從尾部開始拷貝 while (*source != '') //循環被被拷貝的字符串 { *dest = *source;//字符串賦值 dest++; source++; } *dest = '';//結尾 return destbak; } } char * mystrchr(const char *dest, const char ch) { if (dest == NULL) { return NULL; } while (*dest!='') { 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 != '') { int flag = 1;//假定是相等 char *findstrbak = findstr; char *nowdestbak = destbak; while (*findstrbak != '') { if (*nowdestbak != '') { 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] = ''; } else { int nowlength = mystrlen(string->p);//求出當前長度 string->p[nowlength] = ch; string->p[nowlength + 1] = '';//字符的增加 } } 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( string=%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 != '') { *p = *pnext; //刪除一個字符整體向前移動 p++; pnext++; } *p = '';//字符串要有結尾 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 != '') { *pres = *pnext; //刪除一個字符整體向前移動 pres++; pnext++; } *pres = '';//字符串要有結尾 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] = '';//結尾 } 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] = '';//結尾 } } 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 != '') { 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#include #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); }