程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++中strcpy函數的完成

C++中strcpy函數的完成

編輯:關於C++

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 *前往,類型不符,編譯報錯。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved