天天看點

字元串拷貝和記憶體拷貝函數

字元串拷貝和記憶體拷貝函數:

strcpy(拷貝字元串)  

定義函數:char *strcpy( char *dest, const char *src );

strcpy()函數隻能拷貝字元串。strcpy()函數将源字元串 src 的每個位元組拷貝到目的字元串 dest 中,src 字元串末尾的'\0'也被拷貝過去。strcpy()函數傳回參數 dest 的起始位址。如果參數 dest 所指的記憶體空間不夠大,可能會造成緩沖溢出(buffer Overflow)的錯誤情況(程式員必須保證目标字元數組的空間足夠容納需要複制的字元串。如果src 字元

串比dest字元串長,多餘的字元仍将被複制,它們将覆寫原先存儲于dest數組後面的記憶體空間的值),在編寫程式時請特别留意,或者用strncpy()來取代。如果參數 src 和 dst 在記憶體中出現重疊,其結果是未定義的。

strncpy(拷貝字元串)  

定義函數:char *strncpy( char *dest, const char *src, size_t n );

strncpy()會将參數 src 字元串拷貝前 n 個字元至參數 dest 所指的位址。 函數傳回參數 dest 的字元串起始位址。

注意 n 的取值範圍,不要超過 src 和 dest 的長度。

#include<string.h>

#include<stdio.h>

int main()

{

    char a1[30]="string(1)";

    char b1[]="STRING(2)";

    printf("before strcpy()  : %s\n", a1 );

    printf("after  strcpy()   : %s\n", strcpy( a1, b1 ) );

    char a2[30]="string(1)";

    char b2[]="STRING(2)";

        printf("before strncpy() : %s\n", a2 );

        printf("after    strncpy() : %s\n", strncpy( a2, b2, 6 ) );

}  

memcpy(拷貝記憶體内容)   

定義函數:void * memcpy( void * dest, const void *src, size_t n ); memcpy()用來拷貝 src 所指的記憶體内容前 n 個位元組到 dest所指的記憶體位址上。與 strcpy()不同的是,memcpy()會完整的複制 n 個位元組,不會因為遇到字元串結束'\0'而結束。memcpy()函數可以拷貝任意類型的資料。memcpy()函數傳回指向 dest 的指針。指針 src 和 dest 所指的記憶體區域不可重疊。在拷貝字元串時,通常都使用 strcpy()函數;在拷貝其它資料(例如結構)時,通常都使用 memcpy()函數。

memmove(拷貝記憶體内容)  

定義函數:void *memmove(void *dest, const void *src, size_t n );

memmove()與 memc py()一樣都是用來拷貝 src 所指的記憶體内容前 n 個位元組到 dest 所指的位址上。不同的是,當src 和 dest 所指的記憶體區域重疊時,memmove()仍然可以正确的處理,不過執行效率上會比使用 memcpy()略慢些。該函數傳回指向 dest 的指針。

#include<string.h>

int main()

{

    char a[30]="string(1)";

    char b[]="string(2)";

        printf("before strcpy() :%s\n", a );

        printf("after strcpy() :%s\n", strcpy( a, b ) );

    a[30]="string(1)";

    b[]="string(2)";

        printf("before strncpy() : %s\n", a );

        printf("after strncpy() : %s\n", strncpy( a, b, 6 ) );

memccpy(拷貝記憶體内容)  

定義函數:void * memccpy( void *dest, const void *src, int c, size_t n );

memccpy()用來拷貝 src 所指的記憶體内容前 n 個位元組到 dest 所指的位址上。與 memcpy()不同的是,memccpy()會在複制時檢查參數 c 是否出現,若是則傳回 dest 中值為 c 的下一個位元組位址。該函數傳回指向 dest 中值為 c的下一個位元組指針。傳回值為 NULL 表示在 src 所指記憶體前 n 個位元組中沒有值為 c 的位元組。 

#include<string.h>

#include<stdio.h>

int main()

{

    char a[]="string(a)";

    char b[]="string(b)";

    char *p;

        p = ( char * )memccpy( a, b, 'k', sizeof( b ) );

        if( p == NULL )

    {

        // 注意p 為NULL 的情況,這時不能讀取p 所指的地方的内容 

                printf("the return pointer of mymccpy is null !\n");

    }

    else

    {

                printf("memccpy(): %s, *p = %c\n", a, *p );

    }

bcopy (拷貝記憶體内容)  

定義函數:void bcopy ( const void *src,void *dest ,int n); 

bcopy()與 memcpy()一樣都是用來拷貝 src 所指的記憶體内容前 n 個位元組到 dest 所指的位址,不過參數 src 與 dest在傳給函數時是相反的位置。建議使用 memcpy()取代 。

繼續閱讀