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的。