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.