有一个油漆桶的故事不知道楼主听说过没有
有一人被雇佣给一条街道刷油漆。第一天刷了1000米,雇主表示很满意。第二天刷了500米,雇主虽然有点不满意但是还算过得去。第三天这人刷了100米,雇主怒了问他怎么每天越刷越少?这人回答:当然越刷越少,我每次都要跑回来给刷子蘸油漆啊!
回到这个问题。记住以下几点C语言中字符串是char数组
C语言中字符串的长度是由该字符串变量指向的内存地址和其后第一个\0字符的位置决定的。
C语言的字符串长度并没有保存在内存里!每次获取长度都要重新计算。
对于字符串拼接问题,这个问题的其他回答会给你很多解答。如果只是2个短字符串拼接,没有任何问题。但是如果场景是多个长字符串拼接,其他方法都会有问题的。
字符串拼接的实现concat(string1, string2)(假设是inplace,也就是结果保存在string1变量中,并且假设string1足够大,不会overflow。这几个假设并不影响分析结果):找到string1最后一个字符,也就是\0
依次读取string2的每个字符,放到string1末尾
在string1末尾加上一个\0
于是我这样调用:char *string1 = "foo"
char *string2 = "bar"
for(int i=0;i<=1000;i++){
concat(string1,string2);
}第一个循环,读取到string1最后一个字符需要循环3次到最后一个字符
第二个循环,6次
第三个循环,9次
...
假设拼接次数是n,很容易得到这种拼接算法的复杂度是O(n^2)。有没有感觉,这个算法和上面刷油漆的人很像?
要想有效率地拼接字符串,要想想concat函数中哪个部分能进行优化。很显然,循环读取string2是没办法优化的。那就只能对读取string1到第一个\0这个步骤进行优化了
给个思路:char[]第一个元素存字符串长度,去掉最后\0结尾字符。在这个基础上设计算法。
P.S. 这整个例子(刷油漆,以及最后的字符串存储方案)是某篇英文博客上看到的,如果有朋友知道来源请提供一下:-)
P.P.S 当然我举例的for循环,你可以在每次循环结束后将string1的长度存储到一个变量里