C++中strcpy函數的完成。本站提示廣大學習愛好者:(C++中strcpy函數的完成)文章只能為提供參考,不一定能成為您想要的結果。以下是C++中strcpy函數的完成正文
我們先來看個例子
char * strcpy(char * strDest,const char * strSrc) { if ((NULL==strDest) || (NULL==strSrc)) throw "Invalid argument(s)"; char * strDestCopy = strDest; while ((*strDestCopy++ = *strSrc++) != '\0'); return strDest; }
忽然想到之前做過的一個試題
標題:
已知strcpy函數的原型是:
char * strcpy(char * strDest,const char * strSrc);
1.不挪用庫函數,完成strcpy函數。
2.說明為何要前往char *。
講解:
1.strcpy的完成代碼
char * strcpy(char * strDest,const char * strSrc) { if ((strDest==NULL)||(strSrc==NULL)) //[1] throw "Invalid argument(s)"; //[2] char * strDestCopy=strDest; //[3] while ((*strDest++=*strSrc++)!='/0'); //[4] return strDestCopy; }
毛病的做法:
[1]
(A)不檢討指針的有用性,解釋答題者不重視代碼的硬朗性。
(B)檢討指針的有用性時應用((!strDest)||(!strSrc))或(!(strDest&&strSrc)),解釋答題者對C說話中類型的隱式轉換沒有深入熟悉。在本例中char *轉換為bool等於類型隱式轉換,這類功效固然靈巧,但更多的是招致失足幾率增年夜和保護本錢降低。所以C++專門增長了bool、true、false三個症結字以供給更平安的前提表達式。
(C)檢討指針的有用性時應用((strDest==0)||(strSrc==0)),解釋答題者不曉得應用常量的利益。直接應用字面常量(如本例中的0)會削減法式的可保護性。0固然簡略,但法式中能夠湧現許多處對指針的檢討,萬一湧現筆誤,編譯器不克不及發明,生成的法式內含邏輯毛病,很難消除。而應用NULL取代0,假如湧現拼寫毛病,編譯器就會檢討出來。
[2]
(A)return new string("Invalid argument(s)");,解釋答題者基本不曉得前往值的用處,而且他對內存洩露也沒有小心心。從函數中前往函數體內分派的內存是非常風險的做法,他把釋放內存的責任拋給不知情的挪用者,絕年夜多半情形下,挪用者不會釋放內存,這招致內存洩露。
(B)return 0;,解釋答題者沒有控制異常機制。挪用者有能夠忘卻檢討前往值,挪用者還能夠沒法檢討前往值(見前面的鏈式表達式)。妄圖讓前往值肩負前往准確值和異常值的兩重功效,其成果常常是兩種功效都掉效。應當以拋出異常來取代前往值,如許可以加重挪用者的累贅、使毛病不會被疏忽、加強法式的可保護性。
[3]
(A)忘卻保留原始的strDest值,解釋答題者邏輯思想不周密。
[4]
(A)輪回寫成while (*strDest++=*strSrc++);,同[1](B)。
(B)輪回寫成while (*strSrc!='/0') *strDest++=*strSrc++;,解釋答題者對界限前提的檢討不力。輪回體停止後,strDest字符串的末尾沒有准確地加上'/0'。
2.前往strDest的原始值使函數可以或許支撐鏈式表達式,增長了函數的“附加值”。異樣功效的函數,假如能公道地進步的可用性,天然就加倍幻想。
鏈式表達式的情勢如:
int iLength=strlen(strcpy(strA,strB));
又如:
char * strA=strcpy(new char[10],strB);
前往strSrc的原始值是毛病的。其一,源字符串確定是已知的,前往它沒成心義。其二,不克不及支撐形如第二例的表達式。其三,為了掩護源字符串,形參用const限制strSrc所指的內容,把const char *作為char *前往,類型不符,編譯報錯。