strcat 字符串连接

C代码 复制代码
  1. #include <stdio.h>    
  2. #include <string.h>    
  3.   
  4. int main(void)    
  5.  {   
  6.     char string[10]="123456";   
  7.     char *str1     ="abcdefghij";   
  8.   
  9.     printf("string.length=%d/n",strlen(string));   
  10.     strcat(string,str1);   
  11.     printf("string.length=%d/n",strlen(string));   
  12.   
  13.        
  14.     printf("string=%s/n", string);   
  15.     printf("str1=%s/n",str1);   
  16.     return 0;   
  17.   
  18.  }  


但如果将string[10]改为string[20],则正常运行如下:

C代码 复制代码
  1. string.length=6   
  2. string.length=16   
  3. string=123456abcdefghij   
  4. str1=abcdefghij  


这就说明个道理:也许在strcat(str1,str2)中,str1被定义时的长度必须不小于str1+str2的长度!
反过来做一个实验,将一个字符串数组中的值与一个字符指针相连接:

C代码 复制代码
  1. #include <stdio.h>    
  2. #include <string.h>    
  3.   
  4. int main(void)    
  5.  {   
  6.    char string[20]="123456";   
  7.     char *str1     ="abcdefghij";   
  8.   
  9.     printf("str1.length=%d/n",strlen(str1));   
  10.     strcat(str1,string);   
  11.     printf("str1.length=%d/n",strlen(str1));   
  12.   
  13.        
  14.     printf("string=%s/n", string);   
  15.     printf("str1=%s/n",str1);   
  16.  }  

 

C代码 复制代码
  1. str1.length=10   
  2. str1.length=16   
  3. string=123456   
  4. 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 专家编程》



就我们前面的经验,我们可以将代码修改如下,立刻发现其中的问题:

C代码 复制代码
  1. #include <stdio.h>    
  2. #include <string.h>    
  3.   
  4. int main(void)    
  5.  {   
  6.     char string[50]="12345678901234567890123456789012345678901234567890";   
  7.     char *str1     ="abcdefghijabcdefghijabcdefghijabcdefghijabcdefghij";   
  8.   
  9.     printf("str1.length=%d/n",strlen(str1));   
  10.     strcat(str1,string);   
  11.     printf("/nstr1.length=%d/n",strlen(str1));   
  12.   
  13.     return 0;   
  14.   
  15.  }  


在我的机器上,立刻程序崩溃!
再做一个实验,定义2个字符串数组,str1和str2,将他们连接后,改变str2的值,看是否影响str1。

C代码 复制代码
  1. #include <stdio.h>    
  2. #include <string.h>    
  3.   
  4. int main(void)    
  5.  {   
  6.     char str1[50]="12345678901234567890";   
  7.     char str2[50]="12345678901234567890";   
  8.   
  9.     printf("str1.length=%d/n",strlen(str1));   
  10.     strcat(str1,str2);   
  11.     printf("/nstr1.length=%d/n",strlen(str1));   
  12.     str2[0]='A';   
  13.     printf("/nstr1=%s",str1);   
  14.     printf("/nstr2=%s",str2);   
  15.   
  16.     return 0;   
  17.   
  18.  }  

 

C代码 复制代码
  1. str1.length=20   
  2.   
  3. str1.length=40   
  4.   
  5. str1=1234567890123456789012345678901234567890   
  6. str2=A2345678901234567890  


结论是:不影响!



结合以上种种迹象表明:
strcat(str1,str2)中的str1必须为一字符串数组,或者指向字符串数组的指针,而且字符数组的长度要足够大。strcat就是将str2中的值拷贝到str1中,接在str1中现有字符的后面!
现在清楚了,strcat到底发生了什么事情了! 如下面这个例子:

C代码 复制代码
  1. #include <stdio.h>    
  2. #include <string.h>    
  3. int main(void)    
  4.  {    
  5.     char string[101]="12345678901234567890123456789012345678901234567890";   
  6.     char  *str1    ="abcdefghijabcdefghijabcdefghijabcdefghijabcdefghij";   
  7.     char *str2;   
  8.     str2=string;   
  9.     strcat(str2,str1);   
  10.   
  11.     printf("str2.length=%d",strlen(str2));   
  12.     printf("/n str2=%s",str2);   
  13.   
  14.     return 0;    
  15. }   

 

C代码 复制代码
  1. str2.length=100   
  2.  str2=12345678901234567890123456789012345678901234567890abcdefghijabcdefghijabcd   
  3. efghijabcdefghijabcdefghij  


注意:string[101]而不是string[100] 因为字符串处理时,最后要加上字符串结束符。当string[100]来执行上面这个程序,就会报错,程序不能输出str2.length和str2的值。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值