应该改为:
#include<iostream.h>
char *strcpy(char* strDest ,const char* strSrc);
void main ()
{
char adress[]="String Copy";
char
Dst[99]="Why";//不能写为char *Dst="Why";
strcpy(Dst,adress);
cout<<Dst<<endl;
}
char *strcpy(char* strDest ,const char* strSrc)
{
if ( strDest == NULL || strSrc == NULL )
{
cout<<"strDest == NULL || strSrc == NULL"<<endl;
}
while ( (*strDest++ = *strSrc++ ) != '\0' )
{
;
}
return strDest;
}
为什么不能将char
Dst[99]="Why";写为char *Dst="Why";因为字符串的存储形式有两种,一种是字符数组,一种是字符指针,但这两种是由差别的,字符数组可以对存储的字符串进行读写操作,而字符指针即你所定义的char *Dst="Why";只能进行读操作,不能进行写操作。当你尝试语句 while ( (*strDest++ = *strSrc++ ) != '\0' )
时就造成了致命错误,因为strDest接受的是指针Dst,而该指针所指向的字符串是不能进行写操作的。所以应该定义为数组,且数组要足够容纳被复制的字符串。
为了检验你是否懂了,可以在看看下面的论述:
利用指针来处理字符串时,要注意指针所指向的字符串是字符串常量还是存储在字符数组中的字符串,因为这两种字符串在处理时有很大差别。当指针指向的字符串是字符数组中的字符串时,可以用该指针对所指向的存储单元进行读写。当指针指向的字符串是字符串常量时,则只能用该指针对指向的存储单元进行读取。不能进行改写,因为C语言没有对这种情况进行定义。如果利用指向字符串常量的指针对它所值的存储单元进行改写,这个程序在编译时能够通过,在程序运行时可能就会出错。如:
#include"stdio.h"
main()
{
char *s1="good morning!";
char *s2="good afternoon!";
char *p1,*p2;
printf("before copying:\ns1:%s;\ns2:%s;\n",s1,s2);
p1=s1;
p2=s2;
while(*p2++=*p1++);
printf("after copying:\ns1:%s;\ns2:%s;\n",s1,s2);
}
为了避免这种错误,应改为以下形式:
#include"stdio.h"
main()
{
char s1[]="good morning!";
char s2[]="good afternoon!";
char *p1,*p2;
printf("before copying:\ns1:%s;\ns2:%s;\n",s1,s2);
p1=s1;
p2=s2;
while(*p2++=*p1++);
printf("after copying:\ns1:%s;\ns2:%s;\n",s1,s2);
}
对上面循环体为空语句的while循环的理解:可将其写成比较繁琐的形式
while ((*p2=*p1)!='\0')
{
p2++;
p1++;
}
这段程序的含义是将字符串s1的第一个字符赋值给字符数组s2的第一个元素,然后判断赋值后的结果,也就是*p1是否不等于’\0’。如果*p1不等于’\0’,则执行循环体使指针p1和p2指向字符串的下一个字符。然后继续赋值,直到s1的结尾字符’\0’赋给字符串s2为止,才停止循环。这时已经将字符串s1的所有字符赋值给s2了。由于字符’\0’的值等于0,因此,表达式(*p2=*p1)!='\0'等价于(*p2=*p1)!=0,(对比一个变量时如while(*p2!=’\0’)类似于两个变量时的情况,即可以省略’\0’)而表达式(*p2=*p1)!=0又等价于*p2=*p1,所以上面这段程序又等价于:
while (*p2=*p1)
{
p2++;
p1++;
}
又因为可以将指针p1和p2的自增运算放于表达式中,所以上面代码进一步简化为:
while(*p2++=*p1++);
当然这样简化后的唯一区别在于循环结束时,指针p1和p2指向的是’\0’后面的哪个存储单元,但这不影响程序要完成的功能。