C/C++——strcpy函數(shù)的實現(xiàn) 和解析 題目: (一)高質量c++編程上的答案 五,、編寫strcpy函數(shù)(10分) 已知strcpy函數(shù)的原型是 char *strcpy(char *strDest, const char *strSrc); 其中strDest是目的字符串,,strSrc是源字符串,。 (1)不調用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的內容復制到strDest,,為什么還要char * 類型的返回值,? 答:為了實現(xiàn)鏈式表達式。 // 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ù)的返回值又是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是將 常量寫在表達式的左邊,,如果將表達式寫錯了,寫成了賦值,,則馬上報錯,;如果 將表達式改成 strDest ==NULL,在寫的過程中 漏寫了 一個=,,變成了 strDest = NULL,,則檢查不出錯誤來,可能會出現(xiàn)意想不到的錯誤 要正常的話應該寫成: while (*strSrc!='/0') *strDest++=*strSrc++; strDest[i] = '\0';// strDest字符串的末尾加上'\0' 這里還有說一句: = 和 * 和 right ++ 這三個符號中,,* 和 右++的優(yōu)先級都是2級,,是對等的,其次是 = ,, 由于 右++的特點:是滯后使用,, 造成 會先賦值,再指針++ 也就是說:*strDest++=*strSrc++,; *strDest++:會拆成 *strDest 和 strDest++兩個對等的部分 其讓人感覺到的執(zhí)行順序 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))得到的結果還是一樣 |
|