1. 程式人生 > >C++之 字串拷貝函式(面試題目)

C++之 字串拷貝函式(面試題目)

1.已知strcpy 函式的原型是:
char *strcpy(char *strDest, const char *strSrc);
其中strDest 是目的字串,strSrc 是源字串。不呼叫C++/C 的字串庫函式,請編寫函式 strcpy
答案:
c程式碼

char *strcpy(char *strDest, const char *strSrc)
{
if ( strDest == NULL || strSrc == NULL)
return NULL ;
if ( strDest == strSrc)
return strDest ;
char *tempptr = strDest ;
while( (*strDest++ = *strSrc++) !='/0')
;
return tempptr ;
}

注意要點,

(1)傳過來的源指標strSrc所指的字串內容在該函式內是不能夠修改的,因此應該宣告為const型別。

(2)判斷源指標或目的指標為空的情況,思維嚴謹,要考慮異常處理。

(3)要考慮傳過來的源和目的指標指向同一個記憶體區的情況,如果指向同一記憶體區則源指標=目的指標,直接返回其中一個即可。

(4)函式原型要注意返回值為目的串的首地址,要考慮拷貝函式的返回值做其他函式的引數

C++程式碼,因此在函式內要儲存目的指標的首地址。

(5)在拷貝字串時,有兩種方式要麼先判斷字元是否為空,再拷貝,這時候再迴圈外要給目的串加上'/0'字元;要麼先拷貝再判斷字元為空。

上面程式碼是後一種形式。

前一種形式為  

while(*strDest!='/0')

{

*strDest++=*strSrc++;

}

*strDest='/0';

c++程式碼:

        char * strcpy(char * strDest,const char * strSrc)
        {
                if ((strDest==NULL)||(strSrc==NULL))
                        throw "Invalid argument(s)";

               //注意不能寫成 throw new String("invalid argument(s)"),因為在函式中將動態申請的記憶體,

              //並將地址返回是一個不好的程式設計習慣,使用者容易在使用完函式後,不管記憶體的釋放。

                if ( strDest == strSrc)
                    return strDest ;


                char * strDestCopy=strDest;  
                while ((*strDest++=*strSrc++)!='/0');
                return strDestCopy;
        }

從程式碼中看出在C++程式碼中多了一個異常的處理,用throw拋擲異常。