C语言实现动态结构体数组

祖仙教小凡仙 海鲨数据库架构师

C语言实现动态结构体数组

原因是因为以前使用C++来实现的,主要用VERCTOR C++标准库的失代器

而不是纯C;C++是C语言的超集,除了包含C外,还有C++各种新语法,新库!

不过虽然C++用起来简单,开发效率高,不过相对C语言来说运行速度慢,占用内存大。

最烦得就是编译速度贼慢!

以前小仙使用C++BUILDER 开发WINDOWS桌面应用,基本上编译需要5分钟时间。

而最近编译MYSQL 8.0.20 DEBUG版本,编译近6个小时!就MYSQLD和另外个文件最慢,反复读写硬盘。

而且这两个文件都500-600MB. 而PG源码编译才20分钟就完成了。

MYSQL的C++源码看起来像是看抓妖玄学,鬼画桃符,又跳来跳去。PG就非常清爽!

另外PG基本上概念和ORACLE接近!

这次我要实现读取配置文件的参数,这参数是数据源配置,而且是多个!

这些数据库在私有云上的PDB,每个环境,每个项目,每个微服务一个

那么这样数据源是很多的。这样可以装进数组中。

比如长的这样子

CLASSA=DEV

CLASSB=GOODS

CLASSC=ACCOUNT

CLASSD=小凡仙

USER=ROOT

PASSWD=123456

IP=192.168.3.31

PORT=3306

DBNAME=SHARKDB

CLASSA=TEST

CLASSB=GOODS

CLASSC=ACCOUNT

CLASSD=小凡仙

USER=ROOT

PASSWD=123456

IP=192.168.4.31

PORT=3306

DBNAME=SHARKDB

/*

* File: main.cpp

* Author: zengfankun@小凡仙

*

* Created on 2020年8月13日, 下午4:11

*/

#include

#include

#include

//定义配置文件结构体类型

typedef struct

{

char* pclassA;

char* pclassB;

char* pclassC;

char* pclassD;

char* pUser;

char* pPassword;

char* pIP;

char* pPort

char* pDBName;

} Tdbconf_conten;

void Load_Conf(char* pFileName);//读入配置文件

Tdbconf_conten* GetDBconfArray( FILE* pFileHandle);//返回结构体数组

int strleftcpy(char* pDest, char* pSrc,int n) ;//复制字符串左边

int strsub(char* pDest,const char* pSrc,int post,int size); //复制字符串任意位置

int main(int argc, char** argv) //sqlid classA classB classC dbname

{

char FileName[]="./conf/db.conf";

char caSubStr[10];

Load_Conf(FileName);

strleftcpy(caSubStr,FileName,5);

printf("%s\n",caSubStr);

strsub(caSubStr,FileName,8,7);

printf("%s\n",caSubStr);

}

int strleftcpy(char* pDest, char* pSrc,int n)

{

int len= strlen(pSrc);

if(n>len)

n=len;

while (n--)

{

*(pDest++)=*(pSrc++);

}

*(pDest++)='\0'; //后面打入字符串结束标志

return strlen(pDest);

}

int strsub(char* pDest,const char* pSrc,int post,int size)

{

int len = strlen(pSrc);

if ( size > len )

size = len - post;

if ( post < 0 )

size = 0;

if ( size > len )

return 0;

pSrc =pSrc+post-1; //数组下标是从0开始,所以要减1

while (size--)

{

*(pDest++)=*(pSrc++); //步进再赋值

}

*(pDest++)='\0'; //后面补结束标志

return 1;

}

void Load_Conf(char* pFileName) //装入配置文件

{

FILE* fpFileHandle = NULL;

Tdbconf_conten* pDBCONF_LIST;

int iFileRow;

char buff[255];

fpFileHandle = fopen(pFileName,"r");

if (fpFileHandle != NULL)

{

//fgets(buff,256,fpFileHandle);

//printf("%s have row num:%d\n",pFileName,iFileRow);

pDBCONF_LIST=GetDBconfArray(fpFileHandle);

if(pDBCONF_LIST!=NULL)

{

printf("arrayp[0].ClassA is:%s\n",pDBCONF_LIST[0].pclassA);

printf("arrayp[1].ClassA is:%s\n",pDBCONF_LIST[1].pclassA);

printf("arrayp[0].ClassB is:%s\n",pDBCONF_LIST[0].pclassB);

printf("arrayp[1].ClassB is:%s\n",pDBCONF_LIST[1].pclassB);

}

}

fclose(fpFileHandle);

fpFileHandle=NULL;

}

Tdbconf_conten* GetDBconfArray( FILE* pFileHandle) //暂时没有实现读取配置文件代码

{

static Tdbconf_conten* pDBconf_List; //必须定义静态才能返回给主调函数使用,一般C规范不建议这样做

pDBconf_List=(Tdbconf_conten*) malloc(sizeof(Tdbconf_conten)*1); //分配内存

pDBconf_List[0].pclassA="Proc"; //使用数组下标来赋值,结构体采用点号 pclassA也是CHAR 指针 可以直接指向字符串

pDBconf_List[0].pclassB="Eorc";

pDBconf_List=(Tdbconf_conten*) realloc (pDBconf_List,sizeof(Tdbconf_conten)*1); //分配第二块内存,注意pDBconf_List带入

pDBconf_List[1].pclassA="ProcX";

pDBconf_List[1].pclassB="EorcX";

return pDBconf_List; //返回内存指针

}

//设计不完善的读取文件

void ReadFile()

{

char buff[2048]; //行临时CHAR ARRAY

char* pKey; //KEY

static char* pContent; //VALUE 这个要返回

if (pFileHandle != NULL)

{

if(!feof(pFileHandle))

{

fgets(buff,2049,pFileHandle); //读取2049字符遇\0 \n 就结束

buff_size=strlen(buff); //获得本次读取字符个数

for (i=0;i++;i

{ //01234567

//printf("%c",buff[i]);

if (buff[i]=='=') //如果找到了等号前面就是KEY,后面就是VALUE

{

pKey=(char *)malloc( i * sizeof(char) ); //i位置 原本i是等号位置需要i-1,又因数组下标从0开始所以i+1,两者勾兑后就是i;

strsub(pKey,buff,1,i); //strsub函数从人的习惯1开始 所以i 不用减1

pContent=(char*)malloc ((buff_size-i-1)*sizeof(char));

strsub(pContent,buff,i+2,buff_size-i-1);

if( pContent != NULL)

{

if(strcmp(DBconf_key.classA,pKey)==0)

pdbconf_value.pclassA=pContent;

if(strcmp(DBconf_key.classB,pKey)==0)

pdbconf_value.pclassB=pContent;

if(strcmp(DBconf_key.classC,pKey)==0)

pdbconf_value.pclassC=pContent;

if(strcmp(DBconf_key.classD,pKey)==0)

pdbconf_value.pclassD=pdbconf_value;

if(strcmp(DBconf_key.user,pKey)==0)

pdbconf_value.pUser =pContent;

if(strcmp(DBconf_key.password,pKey)==0)

pdbconf_value.pPassword=pContent;

if(strcmp(DBconf_key.URL,pKey)==0)

pdbconf_value.pConnect=pContent;

if(strcmp(DBconf_key.dbname,pKey)==0)

pdbconf_value.pDBName=pContent;

break;

}

free(pKey);

pKey=NULL;

}

}

除了使用链表外,这个比较方便的数据结构可以实现动态结构体数组.

这里使用了3层,

第一层是VALUE 字符串, 字符串长度不一.不能使用char[9]固定数组,只能使用charpchar指针来指向字符数组.

第二层就是 结构体dbconf_conten 因为结构体里的成员是char 指针,是第一层.

那么结构体成员的9个指针,也需要内存. 读第二个结构体时,会覆盖前面的指针;

那就需要保留前一个结构体9个指针,那么它就需要分配内存.

第三层 是指向结构体数组的指针 Tdbconf_conten* p

函数参数 一般是值传和地址传. 可C语言大量的地址传, 传地址给函数,可以让函数直接修改主函数的变量值,一方面是性能,二是函数可以返回多个参数.

函数返回值一般是用于返回函数的执行状态,无论是int 还是voidchar

当然也有特殊情况,比如我们这里无法在主调函数分配内存再传给函数!

只能在函数里分配好了内存,再返回给主调函数,这里必须使用静态关键字,告诉函数,当函数退出的时候不能释放该内存!

最后要在主函数用完后逐步循环释放内存

c语言 static结构体,C语言实现动态结构体数组相关推荐

  1. c语言动态生成结构体结构,C语言实现动态结构体数组

    C语言实现动态结构体数组 原因是因为以前使用C++来实现的,主要用VERCTOR C++标准库的失代器 而不是纯C:C++是C语言的超集,除了包含C外,还有C++各种新语法,新库! 不过虽然C++用起 ...

  2. c++ 结构体赋值_《零基础看得懂的C语言入门教程》—(十二)结构体是这么回事

    一.学习目标 了解C语言的结构体的使用方法 了解C语言结构体的结构的赋值 了解多种C语言结构体变量的赋值方法和取值方法 目录 <零基础看得懂的C语言入门教程>--(二)简单带你了解流程 & ...

  3. c语言程序设计指针进阶,C语言及程序设计进阶例程-15 指向结构体的指针

    贺老师教学链接  C语言及程序设计进阶 本课讲解 指向结构体变量的指针的应用 #include #include struct Student { int num; char name[12]; ch ...

  4. c语言结构体与共同体课件,《结构体与共同体》PPT课件.ppt

    <<结构体与共同体>PPT课件.ppt>由会员分享,可在线阅读,更多相关<<结构体与共同体>PPT课件.ppt(44页珍藏版)>请在装配图网上搜索. 1 ...

  5. 一文攻破结构体-C语言

    一文攻破结构体-C语言 1 什么是结构体 1.1 结构体类型 结构体(structure)是由不同类型数据组成的组合型的数据结构,可以看做变量的集合.结构体也是一个数据类型,就像和 int.char一 ...

  6. c++ new一个结构体_C语言结构体,又一个纸老虎,纯干货讲解(附代码)

    来源:网络,排版整理:晓宇 微信公众号:芯片之家(ID:chiphome-dy)结构体的定义结构体(struct)是由一系列具有相同类型或不同类型的数据构成的数据集合,也叫结构.结构体和其他类型基础数 ...

  7. 【精华文】C语言结构体特殊情况分析:结构体指针 / 基本数据类型指针,指向其他结构体

    参考链接:Structure pointer pointing to different structure instance 注:可以查看此篇的问题和唯一的回复,那是相对正确的,不要看comment ...

  8. c语言事件结构体,C语言结构体史上最详细的讲解

    struct结构体数据类型 前言 我们知道,在C语言中有一些基本的数据类型,如char int float long double string(c99) 等等数据类型,他们可以表示一些事物的基本属性 ...

  9. 结构体嵌套结构体c语言,结构体的相互嵌套

    编程时要用到C语言中结构体的自引用,由于用的少,学得时候也没在意,趁用到,回忆一下. 结构体的自引用(self reference),就是在结构体内部,包含指向自身类型结构体的指针. 结构体的相互引用 ...

最新文章

  1. 微软聘请游说公司为收购雅虎作势
  2. One Class SVM 对于样本不均衡处理思路——拿出白样本建模,算出outlier,然后用黑去检验效果...
  3. 从老赖们“维权”,看拍拍贷的底色
  4. Cpp / 右值、纯右值、将亡值
  5. 利用FormData对象实现AJAX文件上传功能及后端实现
  6. php追加数据,php追加数据到mysql
  7. fastdfs-02-上传与下载流程
  8. via浏览器下载路径_Via安卓浏览器(软件篇)
  9. 【整理分享1】PHP中exit()与die()的区别
  10. 适合做软件官网展示的源码
  11. 《微积分:一元函数积分学》——基本积分表
  12. 如何利用python画一些简单的图形
  13. 03、订单商品信息表.sql
  14. Unity个人游戏开发总结
  15. linux 使用设备树点亮LED 实战
  16. A State-of-the-Art Survey on Deep Learning Theory and Architectures论文翻译分析
  17. 有道云笔记linux使用教程,办公必备神器系列五:云笔记:为知笔记、印象笔记、有道云笔记...
  18. CSS3自定义滚动条样式 -webkit-scrollbar
  19. Windows下文件或文件夹不能删除时的解决办法
  20. dingtalk 一个让钉钉服务端开发更简单的golang工具库

热门文章

  1. Web信息系统采用浏览器 服务器结构,基于web浏览器服务器框架体系教材管理系统.doc...
  2. html隐藏qq右上角三个点,qq聊天出现这“3个小标志”,你们多半“坠入爱河”,隐藏不住...
  3. 比较好的学习网站:易百教程网
  4. X-Frame-Options响应头防点击劫持
  5. 手机卡如何注销,解析大全来了
  6. oracle数据库函数mod,oracle数据库常用函数
  7. 人行招生计算机专业,学计算机的在中国人民银行干什么样的工作?
  8. 输入姓名,问好,字符切片
  9. LOST2-Linux机维巡检项目管理工具
  10. Nodejs 快速入门教程