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安全的多!
總結
以上是生活随笔為你收集整理的strcpy和strncpy区别 memcpy strcpy strncpy lstrcpy lstrncpy wstrcpy, memmove的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux内核源代码分析——fork()
- 下一篇: MFC单文档框架编程(一): 分隔窗口的