题目: (一)高质量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”) ); 【规则 2
建议 例如字符串拷贝函数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]: 规则
(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))得到的结果还是一样 |
|