51.數組庫內聚和耦合庫中庫
阿新 • • 發佈:2018-01-30
post 初始化 自定義 con 分配內存 png pau body 圖片
string.h
1 #pragma once 2 #include <stdio.h> 3 #include <stdlib.h> 4 #include <locale.h> 5 #include <string.h> 6 #include <memory.h> 7 8 9 //stringA類型 10 struct stringA 11 { 12 char *p; 13 int memlength;//內存長度 14 }; 15 16 //stringW類型 17 struct stringW 18{ 19 wchar_t *p; 20 int memlength; 21 }; 22 23 //set_locale 24 void setbackground(const char *str); 25 //初始化,p分配是stringA類型還是stringW類型 26 int init(void *p, char ch);//ch = w ch = a自定義 27 //初始化數據 28 void initwithstring(void *p, char ch, void *pstr); 29 //顯示數據 30 void show(void *p, char ch);
string.cpp
1#include "string.h" 2 3 //初始化數據 4 int init(void *p, char ch)//ch = w ch = a自定義 5 { 6 if (ch == ‘w‘) 7 { 8 struct stringW *pw = (struct stringW *)p;//指針類型轉換 9 pw->p = NULL;//指向為空 10 pw->memlength = 0;//長度為0 11 } 12 else if (ch == ‘a‘) 13 { 14 structstringA *pa = (struct stringA *)p;//指針類型轉換 15 pa->p = NULL;//指向為空 16 pa->memlength = 0;//長度為0 17 } 18 else 19 { 20 abort(); 21 } 22 } 23 24 //用字符串初始化 25 void initwithstring(void *p, char ch, void *pstr) 26 { 27 if (ch == ‘w‘) 28 { 29 struct stringW *pw = (struct stringW *)p;//指針類型 30 pw->p = NULL; 31 pw->memlength = 0; 32 33 wchar_t *pstrbak = (wchar_t *)pstr;//轉換寬字符 34 pw->p = (wchar_t *)malloc((wcslen(pstrbak) +1)* 2); 35 pw->memlength = wcslen(pstrbak) + 2; 36 wcscpy(pw->p, pstrbak);//拷貝 37 } 38 else if (ch == ‘a‘) 39 { 40 struct stringA *pa = (struct stringA *)p; 41 pa->p = NULL; 42 pa->memlength = 0; 43 44 char *pstrbak = pstr;//轉換窄字符 45 pa->p = malloc(strlen(pstrbak) + 1);//分配內存, 46 pa->memlength = strlen(pstrbak) + 1;//內存長度 47 strcpy(pa->p, pstrbak); 48 } 49 } 50 51 //顯示 52 void show(void *p, char ch) 53 { 54 55 if (ch == ‘w‘) 56 { 57 struct stringW *pw = p;//指針類型轉換,確定類型 58 if (pw->p != NULL) 59 { 60 wprintf(L"%ls\n", pw->p); 61 } 62 } 63 else if (ch == ‘a‘) 64 { 65 struct stringA *pa = p;//指針類型轉換,確定類型 66 if (pa->p != NULL) 67 { 68 printf("%s\n", pa->p); 69 } 70 } 71 } 72 73 void setbackground(const char *str) 74 { 75 setlocale(LC_ALL, str); 76 }
array.h
1 #include "string.h" 2 3 //字符串結構體 4 struct dataArray 5 { 6 //void類型的指針,用的時候再進行類型轉換 7 void *p; 8 //字符串數組長度 9 int length; 10 //數據類型 stringa stringw 11 char datatype[10]; 12 //每一個元素的大小 sizeof(stringa) sizeof(stringw) 13 int elemsize; 14 }; 15 16 //初始化 結構體 數組類型 數組每一個元素大小 17 void initWithNull(struct dataArray *pDataArray, char datatype[10], int elemsize); 18 19 // 結構體 數組類型 每一個元素大小 數組首地址 長度 20 void initWithArray(struct dataArray *pDataArray, char datatype[10], int elemsize, void *parray, int n); 21 22 //在數組末尾添加一個元素 23 void backAddOne(struct dataArray *pdataarray, void *parray);//傳遞一個元素的地址 24 25 //顯示數組 26 void showarray(struct dataarray *pdataarray, char datatype[10]);
array.cpp
1 #pragma once 2 3 #include "array.h" 4 5 //初始化 6 void initWithNull(struct dataArray *pDataArray, char datatype[10], int elemsize) 7 { 8 //指針賦值為NULL 9 pDataArray->p = NULL; 10 //長度賦為0 11 pDataArray->length = 0; 12 //每一個元素的大小 13 pDataArray->elemsize = elemsize; 14 //把類型傳給數組中的datatype 15 strcpy(pDataArray->datatype, datatype); 16 } 17 18 //用一個array數組進行初始化 19 void initWithArray(struct dataArray *pDataArray, char datatype[10], int elemsize, void *parray, int n) 20 { 21 //總指針賦值為NULL 22 pDataArray->p = NULL; 23 //數組長度賦為0 24 pDataArray->length = 0; 25 //每一個元素的大小 26 pDataArray->elemsize = elemsize; 27 //把類型傳給數組中的datatype 28 strcpy(pDataArray->datatype, datatype); 29 30 //如果是"stringa"類型 31 if (strcmp(pDataArray->datatype, "stringa") == 0) 32 { 33 //指針類型轉換 34 struct stringA *pa = parray; 35 //每一個元素的大小 36 pDataArray->elemsize = sizeof(struct stringA); 37 //分配內存 38 pDataArray->p = malloc(sizeof(struct stringA)*n); 39 //內存拷貝,把所有結構體拷貝過去 40 memcpy(pDataArray->p, parray, sizeof(struct stringA)*n); 41 //長度為n 42 pDataArray->length = n; 43 } 44 } 45 46 //在數組尾部添加一個元素 47 void backAddOne(struct dataArray *pdataarray, void *parray) 48 { 49 //如果是"stringa"類型 50 if (strcmp(pdataarray->datatype, "stringa") == 0) 51 { 52 pdataarray->p = realloc(pdataarray->p, sizeof(struct stringA)*(pdataarray->length + 1));//拓展數據長度 53 //接受首地址 54 struct stringA *pa = pdataarray->p; 55 struct stringA *palast = parray;//轉換類型 56 57 pa[pdataarray->length].p = palast->p; 58 pa[pdataarray->length].memlength = palast->memlength; 59 60 pdataarray->length += 1; 61 } 62 } 63 64 //顯示數據 65 void showarray(struct dataArray *pdataarray, char datatype[10]) 66 { 67 //如果是"stringa"類型 68 if (strcmp(pdataarray->datatype, "stringa") == 0) 69 { 70 //轉換數據類型 71 struct stringA *pa = pdataarray->p; 72 //依次循環,輸出數據 73 for (int i = 0; i < pdataarray->length; i++) 74 { 75 printf("%s ", pa[i].p);//打印字符串 76 } 77 printf("\n"); 78 } 79 }
main.c
1 #include "string.h" 2 #include "array.h" 3 4 void main() 5 { 6 //setbackground("zh-CN"); 7 //struct stringA stringa1; 8 //struct stringW stringw1; 9 ////init(&stringa1, ‘a‘); 10 //initwithstring(&stringa1, ‘a‘, "calc"); 11 //initwithstring(&stringw1, ‘w‘, L"notepad78你好"); 12 //show(&stringa1, ‘a‘); 13 //show(&stringw1, ‘w‘); 14 15 struct stringA stringa[6]; 16 char *str[6] = { "calc","notepad","pause","12345","test" ,"hello"}; 17 18 for (int i = 0; i < 6; i++) 19 { 20 initwithstring(&stringa[i], ‘a‘, str[i]); 21 } 22 23 struct dataArray data; 24 initWithArray(&data, "stringa", sizeof(struct stringA), stringa, 5); 25 showarray(&data, "stringa"); 26 27 //尾部插入 28 backAddOne(&data, &stringa[2]); 29 showarray(&data, "stringa"); 30 31 32 system("pause"); 33 }
運行截圖:
總結:數組庫有一個void類型的指針,可以指向很多數組,並控制數組.數組傳遞的是void類型,根據後面的參數進行轉換,並分配內存.
51.數組庫內聚和耦合庫中庫