小探strncpy函式

2021-09-25 09:27:23 字數 1784 閱讀 1898

原型:extern char *strncpy(char *dest, char *src, int n);

用法:#include 功能:把src所指由null結束的字串的前n個位元組複製到dest所指的陣列中。

說明:如果src的前n個位元組不含null字元,則結果不會以null字元結束。

如果src的長度小於n個位元組,則以null填充dest直到複製完n個位元組。

如果n注:strlen計算字串的長度,不算 \0; sizeof是操作符,計算分配的位元組大小,算 \0。

記憶體重疊問題是指目的位址的記憶體空間的首位址,包含在源記憶體空間中,這兩段記憶體空間有了交集,因而在使用memcpy進行記憶體複製操作時,這段重疊的記憶體空間會被破壞.這種情況在應用程式級**中一般不會出現的,而在驅動或核心級**中要十分小心,盡量使用memmove函式。

memcpy對記憶體空間有要求的,dest和src所指向的記憶體空間不能重疊,否則複製的資料是錯誤的.下面具體講解一下這個錯誤是如何產生的。如果記憶體空間布局入下圖所示:

src所指向的記憶體空間後面部分資料被新拷貝的資料給覆蓋了(也就是dest<=src+size).所以拷貝到最後,原來的資料肯定不是原來的資料,拷貝的資料也不是想要的資料。下面舉例:

intmain()

結果srtncpy不支援記憶體區域重疊;而現在的memcpy已經支援,能夠達到和memmove一樣的效果,即使在目的位址和原位址存在重疊時也能達到我們想要的結果。面試中經常會遇到讓你寫乙個能夠處理記憶體重疊的strncpy,標準庫中的strncpy是不考慮記憶體重疊的,如果出現記憶體重疊,結果將是未定義的。

網上的很多部落格也有這個**的實現,其實很多也是有問題的,沒有考慮src長度小於len的問題:

char

*strncpy

(char

*dst,

const

char

*src, size_t len)

else

return res;

}

那麼,如果要處理記憶體重疊,該怎麼辦?如果記憶體重疊和src的長度小於len這兩種情況同時出現,又如何處理?

見圖,假設紅色部分為src,黃色為dst。如果出現記憶體重疊,我們很容易想到:從後往前拷貝。如果src的長度小於len,則在後面補nul。

char

*strncpy

(char

*dst,

const

char

*src, size_t len)

if(dst >= src && dst <= src + len -1)

//重疊,從後向前複製

else

while

(offset--

)return res;

}

最後,注意:如果len的值大於dst的值,就會破壞dst後面的記憶體空間,這應該是要避免的。如果n =destin串長度,則destin串沒有null字元,會導致輸出會有亂碼。如果不考慮source串複製完整性,可以將destin 最後一字元置為』\0』。參考:深入理解strncpy這個函式

memcpy使用時需要注意的地方

常見字串函式

c語言之memcpy函式

模板 strncpy函式

strncpy是 c語言的函式之一,來自 c語言標準庫,定義於 string.h,char strncpy char destin,char source,int maxlen 把src所指由null結束的字串的前n個位元組複製到dest所指的陣列中。1 2 3 標頭檔案 include char ...

strncpy函式使用

dest 表示複製的目標字元陣列 src 表示複製的源字元陣列 n 表示複製的字串長度。char mystr null uint8 i 0 uint32 cnt 0 uint8 sub 16 mystr strstr pbuffer,data cnt strlen mystr strncpy sub...

Strcpy函式和Strncpy函式

strcpy函式原型char strcpy char strdestination,const char strsource 庫函式下的strcpy include include intmain char arr2 abcdef strcpy arr1,arr2 printf s arr1 ret...