Chinaunix首页 | 论坛 | 博客
  • 博客访问: 23837
  • 博文数量: 13
  • 博客积分: 501
  • 博客等级: 下士
  • 技术积分: 155
  • 用 户 组: 普通用户
  • 注册时间: 2009-05-30 07:53
文章分类

全部博文(13)

文章存档

2011年(1)

2010年(1)

2009年(11)

我的朋友

分类: C/C++

2009-12-07 23:28:39

Shlemiel得到一份当街道油漆匠的工作,工作内容是在马路中间喷涂点画线。第一天,他拿出一罐漆来到他负责的路段,喷涂了300码长的线。“干得不错!”他的老板称赞道,“真是一位麻利的工匠”,然后赏给他一个戈比(一种俄罗斯辅币,译者注)。
第二天,Shlemiel只喷涂了150码。“喏,虽然不如昨天那样好,但你仍然算得上一位麻利的工匠!150码还是值得肯定的一个长度,”老板说完又赏给他一戈比。
接下来的一天,Shlemiel只喷涂了30码长的马路。“才30码!”他的老板吼道。“这太令人难以接受了!第一天你干的工作量是今天的10倍!接下来是怎么回事?”
“我尽力了,”Shlemiel说道。“一天一天下去,我离油漆罐越来越远!”
看代码:

char bigString[1000]; /* 永远也不知道需要分配多大的存储空间... */
bigString[0] = '\0';
strcat(bigString,"John, ");
strcat(bigString,"Paul, ");
strcat(bigString,"George, ");
strcat(bigString,"Joel ");


这能够应付,不是吗?是的。并且,看起来也很漂亮整洁。函数性能如何?能够运行得尽可能快吗?可扩展性如何?要是有一百万个字符串要追加,这样处理还算得上很好的方式吗?




更合理的方案:

char* bigString;
int i = 0;
i = strlen("John, ")
+ strlen("Paul, ")
+ strlen("George, ")
+ strlen("Joel ");
bigString = (char*) malloc (i + 1);
/* 别忘了存放空终止字符也要空间!*/
...




c的解决方案:
这个性能当然是线性而不是n2的,因此它不会在串接许多字符串时而导致性能下降。

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 ");


阅读(313) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~