strcpy和strncpy區別 memcpy strcpy strncpy lstrcpy lstrncpy wstrcpy, memmove

 

strcpy和strncpy區別(2009-04-27 15:48:52)
轉載標籤:雜談 分類:C++/C
第一種情況:
char* p="how are you ?";
char name[20]="ABCDEFGHIJKLMNOPQRS";


strcpy(name,p);   //name改變爲"how are you ?\0OPQRS "     ====>錯誤!
strncpy(name,p,sizeof(name))    //name改變爲"how are you ?      "       ====>正確!

第二種情況:
char* p="how are you ?";
char name[20];

strcpy(name,p);    //name改變爲"how are you ?\0未知字符 "     ====>錯誤!
name[sizeof(name)-1]='"0'      //和上一步組合,得到正確的結果!
strncpy(name,p,sizeof(name));        //name改變爲"how are you ?      "      ====>正確!

第三種情況:
char* p="how are you ?";
char name[10];

strcpy(name,p);      //name改變爲"how are yo"     ====>無結束符'\0',錯誤!
name[sizeof(name)-1]='"0'      //和上一步組合,彌補結果。但要注意,字符傳遞錯誤!
strncpy(name,p,sizeof(name));      //和單純的一步strcpy結果一樣!


總結:strcpy
如果源長>目標長,則將源長中等於目標長的字符拷貝到目標字符串
如果源長<目標長,則源長全部拷貝到目標字符串,不包括'\0'
strncpy
如果目標長>指定長>源長,則將源長全部拷貝到目標長,自動加上'\0'


如果指定長<源長,則將源長中按指定長度拷貝到目標字符串,不包括'\0'

如果指定長>目標長,error happen!

memcpy strcpy strncpy lstrcpy lstrncpy wstrcpy, memmove

memcpy
原型 extern void *memcpy(void *dest, void *src, unsigned int count);
功能:由src所指內存區域複製count個字節到dest所指內存區域。
說明:src和dest所指內存區域不能重疊,函數返回指向dest的指針。
出錯可能:
1,dest buffer 不夠大,不能容納src的內容。
2,count 大於 src buffer長度, 造成拷貝越界到別的內容。
3,dest 和 src 有內存重疊。
例如,array[] = {0,1,2,3,4}

memcpy(&array[2], &array[0], 3);

strcpy
原型:extern char *strcpy(char *dest,char *src);
功能:把src所指由'\0'結束的字符串複製到dest所指的數組中。
說明:src和dest所指內存區域不可以重疊且,dest必須有足夠的空間來容納src的字符串。返回指向dest的指針。
出錯可能:
1,src 和 dest有重疊
2,dest空間不足以來容納src的字符串

3,用之前爲初始化數組
char* p="I love pizza!";
char name[20]="ABCDEFGHIJKLMNOPQRS";
strcpy(name,p); //name變爲"I love pizza! OPQRS " 錯!
4,字符串中有中文字符,中文字符佔兩個字節。
char* p = "ABCDEFGHIJKLMNOPQR啊";
strcpy(name, p);

strncpy
原型:extern char *strncpy(char *dest, char *src, int n);
功能:把src所指由'\0'結束的字符串的前n個字節複製到dest所指的數組中。
說明:
        如果src的前n個字節不含NULL字符,則結果不會以NULL字符結束。
        如果src的長度小於n個字節,則以NULL填充dest直到複製完n個字節。
        src和dest所指內存區域不可以重疊且dest必須有足夠的空間來容納src的字符串。
        返回指向dest的指針。
出錯可能:
1,src 和 dest 重疊
2,dest 不足以容納 src的字符串
3,安全性高於strcpy,但是當dest長度大於src長度,兩者出同樣的錯誤。字符串截斷,沒有\0.

lstrcpy lstrncpy
原型: LPTSTR lstrcpy(LPTSTR dest, LPTSTR src);
      LPTSTR lstrcpy(LPTSTR dest, LPTSTR src, int count);
功能:類似於strcpy 和strncpy
說明:這是windows API,只能用於windows平臺。和標準C函數strcpy,strncpy區別在於,如果定義了unicode,lstrcpy() 就變成 wstrcpy()完成double-byte unicode字符的拷貝。

wstrcpy
原型:wchar_t *wstrcpy (wchar_t *ws1,wchar_t *ws2 );
     wchar_t *wstrncpy(wchar_t *ws1,wchar_t *ws2,int n );
功能:類似於strcpy 和strncpy,但是作用於寬字符,
說明:所在頭文件是<wstring.h>,而不是<string.h>
出錯可能:
原理類似窄符拷貝

memmove
原型:extern void *memmove(void *dest, const void *src, unsigned int count);
功能:由src所指內存區域複製count個字節到dest所指內存區域。
說明:src和dest所指內存區域可以重疊,但複製後src內容會被更改。函數返回指向dest的指針。由此可見,用memmove 比memcpy安全的多!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章