日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

strcpy和memcpy的区别 | strcpy和strncpy的区别

發布時間:2025/3/21 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 strcpy和memcpy的区别 | strcpy和strncpy的区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

strcpy和memcpy都是標準C庫函數,它們有下面的特點。
strcpy提供了字符串的復制。即strcpy只用于字符串復制,并且它不僅復制字符串內容之外,還會復制字符串的結束符。

已知strcpy函數的原型是:char* strcpy(char* dest, const char* src);
memcpy提供了一般內存的復制。即memcpy對于需要復制的內容沒有限制,因此用途更廣。
void *memcpy( void *dest, const void *src, size_t count );

?
char * strcpy(char * dest, const char * src) // 實現src到dest的復制 {   if ((src == NULL) || (dest == NULL)) //判斷參數src和dest的有效性   {       return NULL;   }   char *strdest = dest;??????? //保存目標字符串的首地址   while ((*strDest++ = *strSrc++)!='\0'); //把src字符串的內容復制到dest下   return strdest; } void *memcpy(void *memTo, const void *memFrom, size_t size) {   if((memTo == NULL) || (memFrom == NULL)) //memTo和memFrom必須有效 ?????????return NULL;   char *tempFrom = (char *)memFrom;???????????? //保存memFrom首地址   char *tempTo = (char *)memTo;????????????????? //保存memTo首地址?????   while(size -- > 0)??????????????? //循環size次,復制memFrom的值到memTo中 ???????  *tempTo++ = *tempFrom++ ;?   return memTo; }

strcpy和memcpy主要有以下3方面的區別。
1、復制的內容不同。strcpy只能復制字符串,而memcpy可以復制任意內容,例如字符數組、整型、結構體、類等。
2、復制的方法不同。strcpy不需要指定長度,它遇到被復制字符的串結束符"\0"才結束,所以容易溢出。memcpy則是根據其第3個參數決定復制的長度。
3、用途不同。通常在復制字符串時用strcpy,而需要復制其他類型數據時則一般用memcpy

http://www.cnblogs.com/stoneJin/archive/2011/09/16/2179248.html

------------------------------------------

Strcpy和Strncpy的區別- -
第一種情況:
char* p="how are you ?";
char name[20]="ABCDEFGHIJKLMNOPQRS";
strcpy(name,p); //name改變為"how are you ? "====>正確!
strncpy(name,p,sizeof(name)); //name改變為"how are you ? " ====>正確!
第二種情況:
char* p="how are you ?";
char name[10];
strcpy(name,p); //目標串長度小于源串,錯誤!
name[sizeof(name)-1]='\0'; //和上一步組合,彌補結果,但是這種做法并不可取,因為上一步出錯處理方式并不確定
strncpy(name,p,sizeof(name)); //源串長度大于指定拷貝的長度sizeof(name),注意在這種情況下不會自動在目標串后面加'\0'
name[sizeof(name)-1]='\0'; //和上一步組合,彌補結果


總結:strcpy
源字串全部拷貝到目標字串中,包括'\0',但是程序員必須保證目標串長度足夠,且不與源串重疊。
strncpy
如果目標長>=指定長>源長,則將源串全部拷貝到目標串,連同'\0'
如果指定長<源長,則將截取源串中按指定長度拷貝到目標字符串,不包括'\0'
如果指定長>目標長,錯誤!

?

?

?

?

?

char*strncpy(char*dest,char*src,size_tn);

功能:

(c/c++)復制字符串src中的內容(字符,數字、漢字....)到字符串dest中,復制多少由size_t的值決定,返回指向dest的指針。如果遇到空字符('\0')[1]?,則空字符后面全部為空(字符),下面舉例說明[2]?: ?
1 2 3 4 5 6 7 dest[]="Hell99iam!"; ?? ?? src[]="abc\0def"; ?? ?? strncpy(dest,src,5);
此時,dest區域是這樣的:'a','b','c','\0','\0','9','i','a','m','!' 注意:\0,\0并不是添加在!的后面。

頭文件:

?
1 #include<string.h>

說明:

如果n > dest串長度,dest棧空間溢出產生崩潰異常。 否則: 1)src串長度<=dest串長度,(這里的串長度包含串尾NULL字符) 如果n<src串長度,dest[..]=[src1, srcN]。由于長度達到srcNULL,所以直接訪問dest串會發生棧溢出的異常情況,有些變態,一般情況下都不會這么做(即:lenC, lenB, lenA: NG)。 如果n = src串長度,與strcpy一致, (即:lenC, lenB, lenB: OK)。 如果n >src串長度,dest[...]=[0, srcNULL] +[NULL...],OK。(即:lenC, lenB, lenC: OK) 2)src串長度>dest串長度 如果n =dest串長度,則dest串沒有NULL字符,會導致輸出會有亂碼。如果不考慮src串復制完整性,可以將dest 最后一字符置為NULL。(即:lenB, lenC, lenB: NG) 綜上,一般情況下,使用strncpy時,建議將n置為dest串長度(除非你將多個src串都復制到dest數組,并且從dest尾部反向操作),復制完畢后,為保險起見,將dest串最后一字符置NULL,避免發生在第2)種情況下的輸出亂碼問題。當然嘍,無論是strcpy還是strncpy,保證dest串容量(能容納下src串)才是最重要的。

2實現方式編輯

?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 char *strncpy(char *dest, const char *src, int n) { ????char c; ????char *s = dest; ????if (n >= 4) ????{ ????????size_t n4 = n >> 2; ????????for (;;) ????????{ ????????????c = *src++; ????????????*dest++ = c; ????????????if (c == '\0') ????????????????break; ????????????c = *src++; ????????????*dest++ = c; ????????????if (c == '\0') ????????????????break; ????????????c = *src++; ????????????*dest++ = c; ????????????if (c == '\0') ????????????????break; ????????????c = *src++; ????????????*dest++ = c; ????????????if (c == '\0') ????????????????break; ????????????if (--n4 == 0) ????????????????goto last_chars; ????????} ????????n -= dest - s; ????????goto zero_fill; ????} last_chars: ????n &= 3; ????if (n == 0) ????????return s; ????for (;;) ????{ ????????c = *src++; ????????--n; ????????*dest++ = c; ????????if (c == '\0') ????????????break; ????????if (n == 0) ????????????return s; ????} zero_fill: ????while (n-- > 0) ????????dest[n] = '\0'; ????return s; }

3與strcpy的區別編輯

附: Strcpy和Strncpy的區別- - 第一種情況: ?
1 2 3 4 char* p="how are you ?"; char name[20]="ABCDEFGHIJKLMNOPQRS"; strcpy(name,p); //name改變為"how are you ? "====>正確! strncpy(name,p, sizeof(name));//name改變為"how are you ?" =====>正確!后續的字符將置為NULL
第二種情況: ?
1 2 3 4 5 6 char* p="how are you ?"; char name[10]; strcpy(name,p); //目標串長度小于源串,錯誤! name[sizeof(name)-1]='\0'; //和上一步組合,彌補結果,但是這種做法并不可取,因為上一步出錯處理方式并不確定 strncpy(name,p,sizeof(name)); //源串長度大于指定拷貝的長度sizeof(name),注意在這種情況下不會自動在目標串后面加'\0' name[sizeof(name)-1]='\0'; //和上一步組合,彌補結果

轉載于:https://www.cnblogs.com/kungfupanda/archive/2012/12/31/2840800.html

總結

以上是生活随笔為你收集整理的strcpy和memcpy的区别 | strcpy和strncpy的区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。