字元串拷貝和記憶體拷貝函數:
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()取代 。