C/C++——strcpy函數(shù)的實(shí)現(xiàn) 和解析 題目: (一)高質(zhì)量c++編程上的答案 五、編寫strcpy函數(shù)(10分) 已知strcpy函數(shù)的原型是 char *strcpy(char *strDest, const char *strSrc); 其中strDest是目的字符串,strSrc是源字符串。 (1)不調(diào)用C++/C的字符串庫函數(shù),請編寫函數(shù) 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的內(nèi)容復(fù)制到strDest,為什么還要char * 類型的返回值? 答:為了實(shí)現(xiàn)鏈?zhǔn)奖磉_(dá)式。 // 2分 例如 int length = strlen( strcpy( strDest,
“hello world”) ); 【規(guī)則 2
建議 例如字符串拷貝函數(shù)strcpy的原型: char *strcpy(char *strDest,const char *strSrc); strcpy函數(shù)將strSrc拷貝至輸出參數(shù)strDest中,同時(shí)函數(shù)的返回值又是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]: 規(guī)則
(D)NULL == strDest是將 常量寫在表達(dá)式的左邊,如果將表達(dá)式寫錯(cuò)了,寫成了賦值,則馬上報(bào)錯(cuò);如果 將表達(dá)式改成 strDest ==NULL,在寫的過程中 漏寫了 一個(gè)=,變成了 strDest = NULL,則檢查不出錯(cuò)誤來,可能會(huì)出現(xiàn)意想不到的錯(cuò)誤 要正常的話應(yīng)該寫成: while (*strSrc!='/0') *strDest++=*strSrc++; strDest[i] = '\0';// strDest字符串的末尾加上'\0' 這里還有說一句: = 和 * 和 right ++ 這三個(gè)符號中,* 和 右++的優(yōu)先級都是2級,是對等的,其次是 = , 由于 右++的特點(diǎn):是滯后使用, 造成 會(huì)先賦值,再指針++ 也就是說:*strDest++=*strSrc++; *strDest++:會(huì)拆成 *strDest 和 strDest++兩個(gè)對等的部分 其讓人感覺到的執(zhí)行順序 l *strDest = *strSrc; l 然后才能是 strDest++,strSrc++ 舉個(gè)例子如下: #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))得到的結(jié)果還是一樣 |
|