一.函數原型
strcpy
extern char *strcpy(char *dest,char *src);
#include <string.h>
功能:把src所指由NULL結束的字元串複制到dest所指的數組中
說明:src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字元串。
傳回指向dest的指針
memcpy
extern void *memcpy(void *dest,void *src,unsigned int count);
#include <string.h>
功能:由src所指記憶體區域複制count個字元串到dest所指記憶體區域.
說明:src和dest所指記憶體區域不能重疊,函數傳回指向dest的指針.
memset
extern void *memset(void *buffer,int c,int count);
功能:把buffer所指記憶體區域的前count個位元組設定成字元c
說明:傳回指向buffer的指針.
二.差別
memset 用來對一段記憶體空間全部設定為某個字元,一般用于在對定義的字元串初始化為' '或者'\0';
例: char a[100];
memset(a,'\0',sizeof(a));
memcpy 是用來做記憶體拷貝,可以用來拷貝任何資料類型的對象,可以指定拷貝的資料長度;
例:
char a[100],b[50];
memcpy(b,a,sizeof(b)); //注意:如果使用sizeof(a),會造成記憶體溢出
mem是一段記憶體,他的長度,必須自己記住.memcpy是見着什麼拷貝什麼。
strcpy 就隻能拷貝字元串,它遇到'\0'就結束拷貝;
例:char a[100],b[50];
strcpy(a,b);
如用strcpy(b,a)要注意a中的字元串長度(第一個'\0'之前) 是否超過50,如果超過,則會造成b的
記憶體溢出.它是不會拷貝'\0'的,是以一般還有加一個語句:
*a='\0';
三.使用技巧
memset 可以友善的清空一個資料結構的變量或數組.
如:
struct sample_struct
{
char csName[16];
int iSeq;
int iType;
};
對于變量
struct sample_struct stTest;
一般情況下,初始化stTest的方法:
stTest.csName[0]='\0';
stTest.iSeq=0;
stTest.iType=0;
而用memset:
memset(&stTest,0,sizeof(struct sample_struct));
如果是數組:
struct sample_struct TEST[100];
memset(TEST,0,sizeof(struct sample_struct)*100);
strcpy是拷貝字元串,以\0為标志結束(即一旦遇到資料值為0的記憶體位址拷貝過程即停止)
strcpy的原型為
char *strcpy(char *dest, const char *src)
而memcpy是給定來源和目标後,拷貝指定大小n的記憶體資料,而不管拷貝的内容是什麼(不僅限于字元)
memcpy的原型為
void *memcpy(void *dest, const void *src, size_t n);