- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
从字符串编程谈计算机底层知识 (转载)
JOEL “ ”
摘录自 《 说软件》书的 深入底层
C语言中字符串的工作方式:
1. 如果不遍历字符串并查找末尾的空字符,就没有办法知道字符串在何处结束 (即字符串
长度)。
2. C JPEG
字符串中不能包含任何零。因此, 字符串中不能存放诸如 图片之类的任何二进
制数据块。
API ASCIZ
对于重要程序、 、操作系统与类库,用户应该像躲避瘟疫一样地避开使用 字符
串。为什么呢?先从编写函数strcat 的一个代码版本入手进行讨论。该函数的功能是将一个字
符串附加在另一个字符串之后。
void strcat(char* dest, char* src )
{
while (*dest) dest++;
while (*dest++ *src++);
}
很简洁,很好用!但你考虑下面的使用情况:
char bigString[1000];/* 永远也不知道需要分配多大的存储空间...*/
bigString[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;
文档评论(0)