【原创】最近在使用C语言编程,发现自己原来好多细节的东西掌握的不是很好,比如字符串的连接函数strcat()其实里面有很多需要注意的东西,今晚在写程序的时候就是在这里出现了一个大的错误,导致程序崩溃,通过GOOGLE以后发现呵呵如下:
【转】
一个会立刻报错的程序代码
#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中的值,否则会出现内存污染。当然几行的代码中是看不出来的。
就我们前面的经验,我们可以将代码修改如下,立刻发现其中的问题:
#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的值。
文章评论(0条评论)
登录后参与讨论