今天刷題時遇到了這個問題,記錄一下。
strcpy比較簡單,就是拷貝字串,遇到'\0'時結束拷貝。
memcpy用來做記憶體拷貝,可以拷貝任何資料型別的物件並指定拷貝資料的長度:char a[100],b[50]; memcpy(b, a, sizeof(b));
總結一下:
strcpy和memcpy主要有以下3方面的區別。
複製的內容不同。strcpy只能複製字串,而memcpy可以複製任意內容,例如字元陣列、整型、結構體、類等。
複製的方法不同。strcpy不需要指定長度,它遇到字串結束符"\0"便結束。memcpy則是根據其第3個引數決定複製的長度。
用途不同。通常在複製字串時用strcpy,而需要複製其他型別資料時則一般用memcpy。
//注意:如果用的是sizeof(a),則會造成記憶體洩露。
比較複雜點的是memset,用來對一段記憶體空間全部設定為某個字元,一般用在對定義的字串進行初始化為『 』或『\0』,比如:
char a[100];memset(a, '\0', sizeof(a));
另外比較方便的是對結構體的操作,memset可以方便的清空乙個結構型別的變數或陣列:
比如有結構體struct sample_strcut sttest,一般清空結構體的話得用如下方式:
struct而如果用memset就非常方便了:sample_struct
;sttest.csname[0]='\0';
sttest.iseq=0;
sttest.itype=0;
memset(&sttest,0,sizeof(struct sample_struct));
參考:今天遇到的筆試題是實現strcpy和memcpy,當時沒做出來,網上一搜才發現是零幾年**就出過的題目,好吧。。
參考:
char *strcpy(char *des, const下面看筆試題的得分點:char *src)
void *memcpy(void *pvto, const
void *pvfrom, size_t size)
char* strcpy(char* strdest,const[1] 引數檢查char*strsrc)
(a)不檢查指標的有效性,說明設計者不注重程式的健壯性
(b)檢查指標的有效性時使用((!strdest) || (!strsrc))或(!(strdest && strsrc)),說明對c語言中型別隱式轉換沒有深刻認識,
在本例中char*轉換為bool即是型別隱式轉換,這種功能雖然靈活,但是更多的是導致出錯概率的增大和維護成本的增高
(c)檢查指標的有效性時使用((strdest==0)||(strsrc==0))說明答題者不知道使用常量的好處。直接使用字面常量(如本例中的0)
會減少程式的可維護性。
0雖然簡單,但程式中可能出現很多處對指標的檢查,萬一出現筆誤,編譯器不能發現,生成的程式內含邏輯錯
誤,很難排除。而使用null代替0,如果出現拼寫錯誤,編譯器就會檢查出來。
[2] 返回值
(a)return new string("invalid arguments");,說明答題者根本不知道返回值得用途,並且它對記憶體洩露也沒有警惕心,從函式體中
返回函式體內分配的記憶體是十分危險的做法,他把釋放記憶體的義務拋給不知情的呼叫者,絕大多數情況下,呼叫者不會釋放記憶體,這導致記憶體洩露
(b)return 0;,說明答題者沒有掌握異常機制。呼叫者有可能忘記檢查返回值,呼叫者還可能無法檢查返回值(見後面的鏈式表示式)。妄想讓返回
值肩負返回正確值和異常值的雙重功能,其結果往往是兩種功能都失效。應該以丟擲異常來代替返回值,這樣可以減輕呼叫者的負擔、使錯誤不會被忽略、
增強程式的可維護性。
[3] 細節
(a)忘記儲存原始的strdest值,說明答題者邏輯思維不嚴密。
[4] 細節
(a)迴圈寫成while (*strdest =*strsrc );,同[1](b)。
(b)迴圈寫成while (*strsrc!='\0') *strdest =*strsrc ;,說明答題者對邊界條件的檢查不力。迴圈體結束後,strdest字串的末尾沒有正確地加上'\0'。
最後,為啥要返回char *?
返回strdest的原始值使函式能夠支援鏈式表示式,增加了函式的「附加值」。同樣功能的函式,如果能合理地提高的可用性,
自然就更加理想。鏈式表示式的形式如:
int ilength=strlen(strcpy(stra,strb));
又如:char * stra=strcpy(new char[10],strb);
返回strsrc的原始值是錯誤的。其一,源字串肯定是已知的,返回它沒有意義。其二,不能支援形如第二例的表示式。
其三,為了保護源字串,形參用const限定strsrc所指的內容,把const char *作為char *返回,型別不符,編譯報錯。y
strcpy,memcpy和memset的區別
strcpy函式的原型 char strcpy char dest,const char src memcpy函式的原型 void memcpy void dest,const void src,size t count memset函式的原型 memset void s,int ch,size t...
strcpy memcpy和memset之間的區別
strcpy比較簡單,就是拷貝字串,遇到 0 時結束拷貝。memcpy用來做記憶體拷貝,可以拷貝任何資料型別的物件並指定拷貝資料的長度 char a 100 b 50 memcpy b,a,sizeof b 總結一下 strcpy和memcpy主要有以下3方面的區別。複製的內容不同。strcpy只能...
記憶體重疊strcpy memcpy
詳細參考 詳細參考 已知strcpy函式的原型是 char strcpy char dst,const char src 實現strcpy函式 解釋為什麼要返回char 假如考慮dst和src記憶體重疊的情況,strcpy該怎麼實現 2.strcpy函式的形式 char strcpy char st...