51.数组库内聚和耦合库中库

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类型,根据后面的参数进行转换,并分配内存.

原文地址:https://www.cnblogs.com/xiaochi/p/8379695.html

时间: 2024-10-09 09:47:25

51.数组库内聚和耦合库中库的相关文章

numpy库中数组的数据类型

numpy库中数组的数据类型 dtype是一个特殊的对象,它含有ndarray将一块内存解释为特殊数据类型所需要的信息 指定数据类型创建数组 >>> import numpy as np >>> arr1=np.array([1,2,3,4],dtype=np.float64) >>> arr2=np.array([1,2,3,4],dtype=np.int32) >>> arr1.dtype dtype('float64') >

STL笔记(6)标准库:标准库中的排序算法

STL笔记(6)标准库:标准库中的排序算法 标准库:标准库中的排序算法The Standard Librarian: Sorting in the Standard Library Matthew Austern http://www.cuj.com/experts/1908/austern.htm?topic=experts 用泛型算法进行排序    C++标准24章有一个小节叫“Sorting and related operations”.它包含了很多对已序区间进行的操作,和三个排序用泛型

[C++11笔记001]修改通用库中的XDynamicArray,使它可以支持C++11的初始化列表和for循环

今天,有空翻了一下<C++Primer plus(第六版)>,看到里面有介绍新的for循环和初始化列表,但是我实现的动态数组XDynamicArray不支持这些新特性,没办法,只好进行改造了. 首先是for循环,如下面的样式 for(auto e:stList) { cout<<e<<endl; } 是于就各种google,和查找C++11的array的源代码,总结:就是提供一个标准的iterator和begin,end这两个方法,就可以了. 是于定义了一个iterat

Arduino下LCD1602综合探究(中)——如何减少1602的连线,LiquidCrystal库,LiquidCrystal库中bug的解决方法

一.前言: 上文中,笔者系统的阐述了1602的两种驱动方式,并简单的提到了Arduino的LiquidCrystal库.本文紧接上文,对以下两个问题进行更加深入的探讨:如何能够使1602对Arduino的端口占用降到最少?LiquidCrystal库到底应该如何学习?在Arduino下LCD1602综合探究(下)中,笔者拟介绍一个1602的综合性实验,以期对前文的内容加以综合应用和总结.闲话少说,下面开始进入正文. 二.减少1602对Arduino的端口占用 <1>不使用I2C 在上文中,笔者

线程高级应用-心得8-java5线程并发库中同步集合Collections工具类的应用及案例分析

1.  HashSet与HashMap的联系与区别? 区别:前者是单列后者是双列,就是hashmap有键有值,hashset只有键: 联系:HashSet的底层就是HashMap,可以参考HashSet的类源码,默认构造方法为: public HashSet(){ map = new HashMap<key,Object> } 就是HashSet只用HashMap的键,而不用他的值,前者的值可以程序员随便指定,反正不用 2.  线程并发库中的集合优路劣之分 HashMap和HashSet如果在

numpy函数库中一些常用函数的记录

numpy函数库中一些常用函数的记录 最近才开始接触python,python中为我们提供了大量的库,不太熟悉,因此在<机器学习实战>的学习中,对遇到的一些函数的用法进行记录. (1)mat( ) numpy函数库中存在两种不同的数据类型(矩阵matrix和数组array),都可以用于处理行列表示的数字元素.虽然他们看起来很相似,但是在这两个数据类型上执行相同的数学运算可以得到不同的结果,其中numpy函数库中matrix与MATLAB中matrices等价. 调用mat( )函数可以将数组转

numpy函数库中一些经常使用函数的记录

##numpy函数库中一些经常使用函数的记录 近期才開始接触python,python中为我们提供了大量的库,不太熟悉.因此在<机器学习实战>的学习中,对遇到的一些函数的使用方法进行记录. (1)mat( ) numpy函数库中存在两种不同的数据类型(矩阵matrix和数组array),都能够用于处理行列表示的数字元素. 尽管他们看起来非常类似,可是在这两个数据类型上运行同样的数学运算能够得到不同的结果,当中numpy函数库中matrix与MATLAB中matrices等价. 调用mat( )

Boost库中scoped_ptr

1.VC和VS VC版并不是标准C++,VS版符合标准C++,其语法相当严格. 缺点:VC和VS都只能释放一个具体类型空间,不能对数组空间进行释放,还有写时拷贝的问题:         所以引发了Boost库的出现来解决此类问题. 2.Boost库 推荐看一下Boost库完全开发指南. Boost本身是开源库,在C++中的地位举足轻重,第三章内存管理,智能指针: C++中也提供了智能指针,但是并不能解决所有问题. smart_ptr库中:new delete的运用不正确,是C++中造成资源获取/

C++标准库中next_permutation和pre_permutation实现原理

标准库中next_permutation函数:找当前序列中元素排列的下一个排列,按照字典顺序进行排列.比如说数组排列"123",那么它的下一个排列为"132",并且返回true.如果当前序列没有下一个排列,我们返回false,且把当前排列置为最小的排列,比如说:排列"321",因为该排列已经是最大的排列,所以它没有下一个排列.我们把该排列置为"123",并且返回false. 标准库实现两个重载版本的next_permutati