strcpy ,strncpy ,strlcpy特點

簡單描述一下三個函數: strcpy ,strncpy ,strlcpy;

1. 首先,strcpy是最不安全拷貝字符串函數,因爲src串的長度有時會很長。隨後strncpy函數爲了解決這個問題出現了,它對於字符串末尾的’\0’處理不是很好。

例1: 

char str[12]; 

strncpy(str, "hello world", 12);

在例1中只會把str數組填滿,但這個字符串卻沒有’\0’的結束符,另外,如果目標空間空間不足,那麼會導致buffer overflow。

它的實現如下:

 charstrcpy(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;

}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章