c语言如何实现数组,如何实现这样一个数组 ?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

#ifndef MY_CSF_H// C String函数

#define MY_CSF_H 1

//

#include

#include

#include

#include

#include

//@@@@@@@@@@@@@@@@@@@@ char* + size_t @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

typedef struct TScpsi {

size_t s;

char *c;

}Tcpsi;

//@@@@@@@@@@@@@@@@@@@@ Tcpsi* + size_t + size_t @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

typedef struct {

size_t s;

size_t n;

Tcpsi *p;

}Tcsis;

//@@@@@@@@@@@@@@@@@@@@ b为假 提示cs @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

inline void iferr(bool b,const char *cs) {

if(!b) {

fputs(cs,stderr);

putc('\n',stderr);

system("pause");

exit(1); } }

//@@@@@@@@@@@@@@@@@@@@ 字符串获取 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

#define csiget(DP) csifget(DP,stdin)

char *csifget(Tcpsi *re,FILE *fp) {

if(0==re->s) {

re->s=16;

re->c=(char *)calloc(re->s,sizeof(char));

iferr(re->c,"内存申请失败"); }

if(!( fgets(re->c,re->s,fp) )) {

re->s=0;

free(re->c);

re->c=NULL;

return re->c; }

char *cp;

size_t si;

while(1) {

cp=strchr(re->c,'\n');

if(cp) {

*cp='\0';

return re->c; }

else {

re->s *= 2;

re->c=(char *)realloc(re->c,(re->s)*sizeof(char));

iferr(re->c,"内存申请失败");

si=strlen(re->c);

if(!( fgets(re->c+si, re->s-si, fp) ))

return re->c;

} } }

//Tcpsi csi={0};

//csiget(&csi);

//printf("%s\n%llu %llu\n",csi.c,csi.s,strlen(csi.c));

//csifre(&csi);

//@@@@@@@@@@@@@@@@@@@@ 字符串复制 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

char *csicpy(Tcpsi *re,const char *cpy) {

if(0==re->s) {

size_t s;

for(s=8; s

re->s=s;

re->c=(char *)calloc(re->s,sizeof(char));

iferr(re->c,"内存申请失败"); }

bool b=0;

while(re->s < strlen(cpy)+1) {

re->s *= 2;

b=1; }

if(b) {

re->c=(char *)realloc(re->c,(re->s)*sizeof(char));

iferr(re->c,"内存申请失败"); }

strcpy(re->c,cpy);

return re->c; }

//@@@@@@@@@@@@@@@@@@@@ 字符串cat @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

char *csicat(Tcpsi *re,const char *cat) {

if(0==re->s)

return csicpy(re,cat);

bool b=0;

while(re->s-strlen(re->c)-1 < strlen(cat)) {

re->s *= 2;

b=1; }

if(b) {

re->c=(char *)realloc(re->c,(re->s)*sizeof(char));

iferr(re->c,"内存申请失败"); }

strcat(re->c,cat);

return re->c; }

//@@@@@@@@@@@@@@@@@@@@ 字符串free @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

void csifre(Tcpsi *re) {

if(0==re->s) {

re->c=NULL;

return ; }

re->s=0;

free(re->c);

re->c=NULL; }

//@@@@@@@@@@@@@@@@@@@@ 字符串获取 单词 @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

#define csigetw(DA) csifgetw(DA,stdin)

char *csifgetw(Tcpsi *re,FILE *fp) {// 输入EOF可能有BUG

int c0;

do {

c0=getc(fp);

}while(isspace(c0));

if(EOF==c0) {

csifre(re);

return re->c; }

if(0==re->s) {

re->s=16;

re->c=(char *)calloc(re->s,sizeof(char));

iferr(re->c,"内存申请失败"); }

re->c[0]=c0;

size_t s0;

for(s0=1; 1; ++s0) {

if(re->s <= s0) {

re->s *= 2;

re->c=(char *)realloc(re->c,(re->s)*sizeof(char));

iferr(re->c,"内存申请失败"); }

c0=getc(fp);

if(EOF==c0 || isspace(c0))

break;

re->c[s0]=c0;

}

re->c[s0]='\0';

ungetc(c0,fp);

return re->c; }

//@@@@@@@@@@@@@@@@@@@@ Tcsis get @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

#define csisget(DA) csismget(DA,0,"")

#define csiscat(DA,DB) csismget(DA,1,DB)

char *csismget(Tcsis *is,bool b,const char *cat) {

if(0==is->s) {

is->s=8;

is->n=0;

is->p=(Tcpsi *)calloc(is->s, sizeof(Tcpsi));

iferr(is->p,"内存申请失败"); }

if(is->s <= is->n) {

is->s *= 2;

is->p=(Tcpsi *)realloc(is->p, (is->s)*sizeof(Tcpsi));

iferr(is->p,"内存申请失败"); }

is->p[is->n].s=0;

if(0==b) {

if(!( csiget(&is->p[is->n]) ))

return NULL; }

else

csicpy(&is->p[is->n],cat);

++(is->n);

return is->p[(is->n)-1].c; }

//Tcsis is={0};

//for(size_t s=0; csisget(&is); ++s)

//printf("%3llu %3llu %3llu %s\n",

//is.s, is.n, s, is.p[s].c);

//csisfre(&is);

//@@@@@@@@@@@@@@@@@@@@ Tcsis free @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@

void csisfre(Tcsis *is) {

if(0==is->s)

return ;

for(size_t s0=0; s0 < is->n; ++s0)

free(is->p[s0].c);

free(is->p);

is->s = is->n = 0;

is->p=NULL; }

//

#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值