题目:
已知strcpy函数的原型是:
char * strcpy(char * strDest ,const char * strSrc);
- 不调用库函数,实现strcpy函数。
- 解释为什么要返回char*。
方法一
char *strcpy(char *strDest, const char *strSrc)
{
assert((strDest!=NULL) && (strSrc !=NULL));
char *address = strDest;
while( (*strDest++ = * strSrc++) != '\0' )
NULL ;
return address ;
}
strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值?
答:为了实现链式表达式.
例如
int length = strlen( strcpy( strDest, “hello world”) );
方法二
char* strcpy1(char *strDest, const char* strSrc)
{
assert(strSrc != NULL );
assert(strDest != NULL);
int i;
char *address = strDest;
for(i = 0; strSrc[i] != '\0'; i++)
strDest[i] = strSrc[i];
strDest[i] = '\0';
return address;
}
方法三
char * strcpy3(char * strDest, const char * strSrc)
{
if ((NULL == strDest)||(NULL == strSrc))
throw "Invalid argument(s)";
char * strDestCopy=strDest;
while ((*strDest++=*strSrc++)!='\0');
return strDestCopy;
}
总结
- 如果参数是指针,且仅作输入用,则应在类型前加const,以防止该指针在函数体内被意外修改
- 有时候函数原本不需要返回值,但为了增加灵活性如支持链式表达,可以附加返回值。
- 不要将正常值和错误标志混在一起返回。正常值用输出参数获得,而错误标志用return语句返回。错误信息可以用throw抛出。