天天看點

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.