strcpy、strncpy與memcpy strchr 和 strstr的區別與使用方法
strcpy、strncpy與memcpy的區別與使用方法
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把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”。