c语言实现字符串拼接的技巧

C语言中字符串的工作方式: 如果不遍历字符串并查找末尾的空字符,就没有办法知道字符串在何处结束(即字符串长度)。 字符串中不能包含任何零。因此,C字符串中不能存放诸如JPEG图片之类的任何二进制数据块。  对于重要程序、API、操作系统与类库,用户应该像躲避瘟疫一样地避开使用ASCIZ字符串。为什么呢?先从编写函数strcat的一个代码版本入手进行讨论。该函数的功能是将一个字符串附加在另一个字符串之后。void strcat( char* dest, char* src ){while (*dest) dest++;while (*dest++ = *src++);} 很简洁,很好用!但你考虑下面的使用情况: char bigString[1000]; /* 永远也不知道需要分配多大的存储空间... */bigString[0] = '/0';strcat(bigString,"John, ");strcat(bigString,"Paul, ");strcat(bigString,"George, ");strcat(bigString,"Joel ");这样处理还算得上很好的方式吗?  不,该代码使用的是蹩脚的Shlemiel喷涂算法。Shlemiel是谁?他是下面这则笑话中的人物:Shlemiel是谁?他是下面这则笑话中的人物:  Shlemiel得到一份当街道油漆匠的工作,工作内容是在马路中间喷涂点画线。第一天,他拿出一罐漆来到他负责的路段,喷涂了300码长的线。“干得不错!”他的老板称赞道,“真是一位麻利的工匠”,然后赏给他一个戈比(一种俄罗斯辅币,译者注)。第二天,Shlemiel只喷涂了150码。“喏,虽然不如昨天那样好,但你仍然算得上一位麻利的工匠!150码还是值得肯定的一个长度,”老板说完又赏给他一戈比。接下来的一天,Shlemiel只喷涂了30码长的马路。“才30码!”他的老板吼道。“这太令人难以接受了!第一天你干的工作量是今天的10倍!接下来是怎么回事?”“我尽力了,”Shlemiel说道。“一天一天下去,我离油漆罐越来越远!”   如果像前面给出的代码那样使用strcat函数将会出现什么结果。由于strcat的第一部分代码必须每次都扫描整个目的字符串,以反复寻找那个捉摸不定的空终止字符,因此该函数将比所希望的速度慢得多,并且它根本谈不上存在伸缩性。你每天使用的许多代码都有这个问题。如何修正strcat函数呢?有几个聪明的C语言程序员是这样来实现他们自己的mystrcat函数的:

 char* mystrcat( char* dest, char* src ){

while (*dest) {

dest++;

while (*dest++ = *src++);

return --dest;}

char bigString[1000]; /* 永远不知道要分配多少存储空间……*/

char *p = bigString;bigString[0] = '/0';

p = mystrcat(p,"John, ");

p = mystrcat(p,"Paul, ");

p = mystrcat(p,"George, ");

p = mystrcat(p,"Joel ");这个性能当然是线性而不是n2的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值