1. 程式人生 > >strcpy、strncpy與memcpy strchr 和 strstr的區別與使用方法

strcpy、strncpy與memcpy strchr 和 strstr的區別與使用方法

strcpystrncpymemcpy的區別與使用方法

strcpy、strncpy、memcpy這三個C語言函式我們在主機程式碼編寫中會很頻繁的使用到,但是三個函式的區別、使用時該注意什麼還是有必要說下的。

本文參考《C 標準庫》編寫。

一、函式說明

1、memcpy函式

void  *memcpy(void *s1,  const void *s2,  size_t  n);

說明:

函式memcpy從s2指向的物件中複製n個字元到s1指向的物件中。如果複製發生在兩個重疊的物件中,則這種行為未定義。

返回值:

函式memcpy返回s1的值。

2、strcpy函式

char  

*strcpy(char *s2, const char *s1);

說明:

函式strcpy把s1指向的串(包括空字元)複製到s2指向的陣列中。如果複製發生在兩個重疊的物件中,則這種行為未定義。

返回值:

函式strcpy返回s2的值。

3、strncpy函式

char  *strncpy(char *s2, const char *s1, size_t n);

說明:

函式strncpy從s1指向的陣列中最多複製n個字元(不復制空字元後面的字元)到s2指向的陣列中。如果複製發生在兩個重疊的物件中,則這種行為未定義。

如果s1指向的陣列是一個比n短的字串,則在s2定義的陣列後面補空字元,直到寫入了n個字元。

返回值:

函式strncpy返回s2的值。

二、注意事項

strcpy 是依據 “\0” 作為結束判斷的,如果 s2 的空間不夠,則會引起 buffer overflow。

memcpy用來在記憶體中複製資料,由於字串是以“\0”結尾的,所以對於在資料中包含“\0”的資料只能用memcpy。

Strncpy和memcpy很相似,只不過它在一個終止的空字元處停止。當n>strlen(s1)時,給s2不夠數的空間裡填充“\0”;當n<=strlen(s1)時,s2是沒有結束符“\0”的。

在C語言中 strchr 和 strstr函式都被包含在<string.h>標頭檔案中,也就是要呼叫它們時要在程式前面包含<string.h>標頭檔案,也就是寫這個語句:#include<string.h>
strchr函式原型:char * strchr(char * str, int ch); 功能就是找出在字串str中第一次出項字元ch的位置,找到就返回該字元位置的指標(也就是返回該字元在字串中的地址的位置),找不到就返回空指標(就是 null)。
strstr 函式原型: char * strstr(char * str1,char * str2);功能就是找出在字串str1中第一次出項字串str2的位置(也就是說字串sr1中要包含有字串str2),找到就返回該字串位置的指標(也就是返回字串str2在字串str1中的地址的位置),找不到就返回空指標(就是 null)。

這裡隱藏了一個事實,就是s2指向的記憶體一定會被寫n個字元。

所以總的來說注意:

1、s2指向的空間要足夠拷貝;使用strcpy時,s2指向的空間要大於等於s1指向的空間;使用strncpy或memcpy時,s2指向的空間要大於或等於n。

2、使用strncpy或memcpy時,n應該大於strlen(s1),或者說最好n >= strlen(s1)+1;這個1 就是最後的“\0”。

3、使用strncpy時,確保s2的最後一個字元是“\0”。