题目:
(一)高质量c++编程上的答案 五、编写strcpy函数(10分) 已知strcpy函数的原型是 char *strcpy(char *strDest, const char *strSrc); 其中strDest是目的字符串,strSrc是源字符串。 (1)不调用C++/C的字符串库函数,请编写函数 strcpy char *strcpy(char *strDest, const char *strSrc) { assert((strDest!=NULL) && (strSrc !=NULL)); // 2分 char *address = strDest; // 2分 while( (*strDest++ = * strSrc++) != '\0' ) // 2分 NULL ; return address ; // 2分 } (2)strcpy能把strSrc的内容复制到strDest,为什么还要char * 类型的返回值? 答:为了实现链式表达式。 // 2分 例如 int length = strlen( strcpy( strDest, “hello world”) );
【规则6-2-3】不要将正常值和错误标志混在一起返回。正常值用输出参数获得,而错误标志用return语句返回。错误信息可以用throw抛出。
2 建议6-2-1】有时候函数原本不需要返回值,但为了增加灵活性如支持链式表达,可以附加返回值。 例如字符串拷贝函数strcpy的原型: char *strcpy(char *strDest,const char *strSrc); strcpy函数将strSrc拷贝至输出参数strDest中,同时函数的返回值又是strDest。这样做并非多此一举,可以获得如下灵活性: char str[20]; int length = strlen( strcpy(str, “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 /*[0]*/) { if ((NULL == strDest)||(NULL == strSrc)) //[1] throw "Invalid argument(s)"; //[2]
char * strDestCopy=strDest; //[3]
while ((*strDest++=*strSrc++)!='\0'); //[4]
return strDestCopy; }
/*[0]: 规则6-1-3】如果参数是指针,且仅作输入用,则应在类型前加const,以防止该指针在函数体内被意外修改。
(D)NULL == strDest是将 常量写在表达式的左边,如果将表达式写错了,写成了赋值,则马上报错;如果 将表达式改成 strDest ==NULL,在写的过程中 漏写了 一个=,变成了 strDest = NULL,则检查不出错误来,可能会出现意想不到的错误 要正常的话应该写成: while (*strSrc!='/0') *strDest++=*strSrc++; strDest[i] = '\0';// strDest字符串的末尾加上'\0' 这里还有说一句: = 和 * 和 right ++ 这三个符号中,* 和 右++的优先级都是2级,是对等的,其次是 = , 由于 右++的特点:是滞后使用, 造成 会先赋值,再指针++ 也就是说:*strDest++=*strSrc++; *strDest++:会拆成 *strDest 和 strDest++两个对等的部分 其让人感觉到的执行顺序 l *strDest = *strSrc; l 然后才能是 strDest++,strSrc++
举个例子如下: #define product(x) (x * x) int i = 3, j, k; j = product(i++); k = product(++i); cout << j << " " << k << endl;//输出为9和49 即使定义为#define product(x) ((x) * (x))得到的结果还是一样 |
C/C++——strcpy函数的实现 和解析
最新推荐文章于 2025-06-12 22:06:38 发布