天天看點

memset,memcpy,strcpy 的差別

一.函數原型

   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);

繼續閱讀