1. 程式人生 > >51.數組庫內聚和耦合庫中庫

51.數組庫內聚和耦合庫中庫

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 struct
stringA *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.數組庫內聚和耦合庫中庫