char *strcpy(char *dest,const char *src)
{
size_t i = 0;
while((dest[i] = src[i]) != '\0')
i++;
return dest;
}
将指针src指向的字符串复制到指针dest指向的位置;使用数组下标实现的版本
char *strcpy(char *dest,const char *src)
{
char *temp = dest;
while((*dest = *src) !='\0'){
dest++;
src++;
}
return temp;
}
将指针src指向的字符串复制到指针dest指向的位置;使用指针方式实现的版本
因为参数是通过值传递的,所以在strcpy函数中可以以任何方式使用参数dest和src。在此,src和dest是方便进行了初始化的指针,循环每执行一次,它们就沿着相应的数组前进一个字符,知道将src中的结束符'\0'复制到s为止。
实际上,strcpy函数并不会按照上面的这些方式编写。经验丰富的程序员跟喜欢将它编写成下列形式:
char *strcpy(char *dest,const char *src)
{
char *temp = dest;
while((*dest++ = *src++) != '\0')
;
return temp;
}
在该版本中,dest和src的自增运算放到了循环的测试部分中。表达式*src++的值是执行自增运算之前src所指向的字符。后缀运算符++表示在读取该字符之后才改变src的值。同样的道理,在dest执行自增运算之前,字符就被存储到了指针dest指向的旧位置。该字符值同样也用来和空字符'\0'进行比较运算,以控制循环的执行。最后的结果依次将src指向的字符复制到dest指向的位置。直到遇到结束符'\0'为止(同时也复制该结束符)。
为了进一步精炼程序,我们注意到,表达式同'\0'的比较是多余的,因为只需要判断表达式的值是否为0即可。因此,该函数可进一步写成下列形式:
char *strcpy(char *dest,const char *src)
{
char *temp = dest;
while(*dest++ = *src++)
;
return temp;
}
该函数初看起来不太容易理解,但这种表示方法是很有好处的。我们应该掌握这种方法,C语言程序中经常会采用这种写法。