已知strcpy函数的原型是:
char * strcpy(char * strDest,const char * strSrc);
(1)不调用库函数,实现strcpy函数。
(2)解释为什么要返回char *。
代码如下:
1 #include <stdio.h>
2
3 char * strcpy(char * strDest, const char * strSrc) // 实现strSrc到strDest的拷贝
4 {
5 if ((strDest == NULL) || (strSrc == NULL)) //判断参数strDest和strSrc的有效性
6 {
7 return NULL;
8 }
9 char *strDestCopy = strDest; //保存目标字符串的首地址
10 while ((*strDest++ = *strSrc++)!='\0'); //把strSrc字符串的内容拷贝到strDest下
11
12 return strDestCopy;
13 }
14
15 int getStrLen(const char *strSrc) //实现获取strSrc字符串的长度
16 {
17 int len = 0; //保存长度
18 while(*strSrc++ != '\0') //循环直到遇见结束符’\0’为止
19 {
20 len++;
21 }
22
23 return len;
24 };
25
26 int main()
27 {
28 char strSrc[] = "Hello World!"; //要被拷贝的源字符串
29 char strDest[20]; //要拷贝到的目的字符数组
30 int len = 0; //保存目的字符数组中字符串的长度
31
32 len = getStrLen(strcpy(strDest, strSrc)); //链式表达式,先拷贝后计算长度
33 printf("strDest: %s\n", strDest);
34 printf("Length of strDest: %d\n", len);
35
36 return 0;
37 }
(1)strcpy函数的实现说明:
代码5~7行判断传入的参数strDest和strSrc是否为NULL,如果是则返回NULL。
代码第9行把strDest的值保存到strDestCopy。
代码第10行对strSrc和strDest两个指针作循环移动,并不断把复制strSrc内存的值到strDest内存中。
由于第(2)步中保存了strDest的值,因此这里只需返回strDestCopy,那么函数调用完后返回的就是strDest的值。
(2)为什么strcpy函数要返回char *类型呢?这是为了能使用链式表达式。由于在strcpy中使用了char *返回类型,因此在代码32行中可以通过这种链式表达式来同时做两个操作。首先调用strcpy使得strDest复制了strSrc指向的内存数据,然后调用getStrLen函数获取strDest字符串的长度。这样不仅调用方便,而且程序结构简洁明了。程序的输出结果如下:
1 strDest: Hello World!
2 Length of strDest: 12