浏览 3538 次
锁定老帖子 主题:字符串之strcat
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2009-01-21
最后修改:2009-01-21
#include <stdio.h> #include <string.h> int main(void) { char string[10]="123456"; char *str1 ="abcdefghij"; printf("string.length=%d\n",strlen(string)); strcat(string,str1); printf("string.length=%d\n",strlen(string)); printf("string=%s\n", string); printf("str1=%s\n",str1); return 0; } 但如果将string[10]改为string[20],则正常运行如下: string.length=6 string.length=16 string=123456abcdefghij str1=abcdefghij 这就说明个道理:也许在strcat(str1,str2)中,str1被定义时的长度必须不小于str1+str2的长度! 反过来做一个实验,将一个字符串数组中的值与一个字符指针相连接: #include <stdio.h> #include <string.h> int main(void) { char string[20]="123456"; char *str1 ="abcdefghij"; printf("str1.length=%d\n",strlen(str1)); strcat(str1,string); printf("str1.length=%d\n",strlen(str1)); printf("string=%s\n", string); printf("str1=%s\n",str1); } str1.length=10 str1.length=16 string=123456 str1=abcdefghij123456 奇怪,为什么一切正常? 这时,可以猜想strcat(str1,str2)可能要分2中情况: 1.当str1为字符数组时,道理同第一个实验 2.当str1为字符串指针时,则str1无需大于str1+str2的长度,因为str1是指针,指针里存储的是地址! 但是仔细想一下, c语言里面有个经典的经验是,如果你以指针方式定义了一个字符串 char *p="12345678" 那么这个就不能用p[2]=3;这样类似的语句来修改*p中的值,否则会出现内存污染。当然几行的代码中是看不出来的。 引用 数组和指针都可以在它们的定义中用字符串常量进行初始化。尽管看上去一样,底层的机制却不想同。 定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义时同时赋给指针一个字符串常量进行初始化。例如,下面的定义创建了一个字符串常量(为其分配了内存): char *p="breadfruit"; 注意只有对字符串常量才是如此。不能指望为浮点数之类的常量分配空间,如: float *pip=3.141; /*错误!无法通过编译*/ 在ANSI C中,初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。在有些编译器中,字符串常量被存放在只允许读取的文本段中,以防止它被修改。 数组也可以用字符串常量进行初始化: char a[]="gooseberry"; 与指针相反,由字符串常量初始化的数组是可以修改的。其中的单个字符在以后可以改变,比如下面的语句: strncpy(a,"black",5); 就将数组的值修改为"blackberry"。 摘录自《C 专家编程》 就我们前面的经验,我们可以将代码修改如下,立刻发现其中的问题: #include <stdio.h> #include <string.h> int main(void) { char string[50]="12345678901234567890123456789012345678901234567890"; char *str1 ="abcdefghijabcdefghijabcdefghijabcdefghijabcdefghij"; printf("str1.length=%d\n",strlen(str1)); strcat(str1,string); printf("\nstr1.length=%d\n",strlen(str1)); return 0; } 在我的机器上,立刻程序崩溃! 再做一个实验,定义2个字符串数组,str1和str2,将他们连接后,改变str2的值,看是否影响str1。 #include <stdio.h> #include <string.h> int main(void) { char str1[50]="12345678901234567890"; char str2[50]="12345678901234567890"; printf("str1.length=%d\n",strlen(str1)); strcat(str1,str2); printf("\nstr1.length=%d\n",strlen(str1)); str2[0]='A'; printf("\nstr1=%s",str1); printf("\nstr2=%s",str2); return 0; } str1.length=20 str1.length=40 str1=1234567890123456789012345678901234567890 str2=A2345678901234567890 结论是:不影响! 结合以上种种迹象表明: strcat(str1,str2)中的str1必须为一字符串数组,或者指向字符串数组的指针,而且字符数组的长度要足够大。strcat就是将str2中的值拷贝到str1中,接在str1中现有字符的后面! 现在清楚了,strcat到底发生了什么事情了! 如下面这个例子: #include <stdio.h> #include <string.h> int main(void) { char string[101]="12345678901234567890123456789012345678901234567890"; char *str1 ="abcdefghijabcdefghijabcdefghijabcdefghijabcdefghij"; char *str2; str2=string; strcat(str2,str1); printf("str2.length=%d",strlen(str2)); printf("\n str2=%s",str2); return 0; } str2.length=100 str2=12345678901234567890123456789012345678901234567890abcdefghijabcdefghijabcd efghijabcdefghijabcdefghij 注意:string[101]而不是string[100] 因为字符串处理时,最后要加上字符串结束符。当string[100]来执行上面这个程序,就会报错,程序不能输出str2.length和str2的值。 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |