簡單描述一下三個函數: strcpy ,strncpy ,strlcpy;
1. 首先,strcpy是最不安全拷貝字符串函數,因爲src串的長度有時會很長。隨後strncpy函數爲了解決這個問題出現了,它對於字符串末尾的’\0’處理不是很好。
例1:
char str[12];
strncpy(str, "hello world", 12);
在例1中只會把str數組填滿,但這個字符串卻沒有’\0’的結束符,另外,如果目標空間空間不足,那麼會導致buffer overflow。
它的實現如下:
char
*
strcpy
(
char
* des,
const
char
* source)
{
char
* r=des;
while
((*(des++)=*(source++))!=
'\0'
);
return
r;
}
2.看一下strncpy, 它可以說是strcpy的安全版本,但是它的缺點也是很明顯的,如下所示:
char str[20];
strncpy(str, "sample", 15);//這裏的15是指要複製的個數,而不是指str的空間;
可見,15遠遠大於了字符串"sample"的長度,這時strncpy要在剩下的部分補充’\0’。首先說這樣會影響效率,其次對於static或者calloc這樣已經初始化的數組根本不需要填寫’\0’。
因此在使用strncpy拷貝字符串時,通常要這樣寫,
例2:
strncpy(path, homedir, sizeof(path) – 1);
path[sizeof(path) – 1] = ‘\0′;
3. 而strlcpy可以自動處理末尾’\0’,不需要我們手動負責\0,;
size_t strlcpy(char *dst, const char *src, size_t size);
然而strlcpy不是ANSI C函數,至今也不是標準,一般在linux下使用,該函數的實現如下:
size_t strlcpy(char *dst, const char *src, size_t size)
{
size_t len = 0;
while (++len < size && *src)
*dst++ = *src++;
if (len <= size)
*dst = 0;
return len + strlen(src) - 1;
}