再談strncpy函式 值得一看的好文章

2021-07-09 02:40:05 字數 1894 閱讀 4342

strncpy()函式

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

用法:#include

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

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

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

src和dest所指記憶體區域不可以重疊且dest必須有足夠的空間來容納src的字串。

返回指向dest的指標(該指向dest的最後乙個元素)    

strcpy ,strncpy,strlcpy地用法:

好多人已經知道利用strncpy替代strcpy來防止緩衝區越界。但是如果還要考慮執行效率的話,也許strlcpy是乙個更好的方式。

1.strcpy

我們知道,strcpy是依據\0作為結束判斷的,如果to的空間不夠,則會引起bufferoverflow。

strcpy 常規的實現**如下(來自openbsd 3.9):

char* strcpy(char *to, const char *from)

但通常,我們的

from

都**於使用者的輸入,很可能是非常大的乙個字串,因此

strcpy

不夠安全。

2.strncpy

在ansi c中,strcpy的安全版本是strncpy。

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

但strncpy其行為是很詭異的(不符合我們的通常習慣)。標準規定n並不是sizeof(s1),而是要複製的char的個數。

乙個最常見的問題,就是strncpy並不幫你保證\0

結束。

charbuf[8];

strncpy( buf, "abcdefgh", 8 );

看這個程式,buf將會被"abcdefgh"填滿,但卻沒有\0 結束符了。

另外,如果s2的內容比較少,而n又比較大的話,strncpy 將會把之間的空間都用\0填充。這又出現了乙個效率上的問題,如下:

charbuf[80];

strncpy( buf, "abcdefgh", 79 );

上面的strncpy會填寫79個char,而不僅僅是"abcdefgh"本身。

strncpy 的標準用法為:(手工寫上\0)

strncpy(path,src, sizeof(path) - 1);

path[sizeof(path) - 1] = '\0';

3. strlcpy

size_t strlcpy(char*dst, const char *src, size_t siz);

而使用 strlcpy,就不需要我們去手動負責 \0 了,僅需要把sizeof(dst) 告之strlcpy 即可:

strlcpy(path,src, sizeof(path));

函式實現:

size_tstrlcpy(char *dst, const char *src, size_t size)

【*一點點歷史*】

strlcpy並不屬於ansi c,至今也還不是標準。

strlcpy**於openbsd2.4,之後很多unix-like系統的libc中都加入了strlcpy函式,我個人在freebsd、linux裡面都找到了strlcpy。

(linux使用的是glibc,glibc

裡面有strlcpy

,則所有的

linux

版本也都應該有

strlcpy

)但windows下是沒有strlcpy的,對應的是strcpy_s函式

SQL注入原理,值得一看!

sql注入原理,值得一看!隨著b s模式應用開發的發展,使用這種模式編寫應用程式的程式設計師也越來越多。但是由於這個行業的入門門檻不高,程式設計師的水平及經驗也參差不齊,相當大一部分程式設計師在編寫 的時候,沒有對使用者輸入資料的合法性進行判斷,使應用程式存在安全隱患。使用者可以提交一段資料庫查詢 ...

值得一看的聊天技巧

泡妞是一門技術,可以更好的指引我們追求幸福。不提倡為了泡妞而泡妞的行為,玩弄拋棄mm是可恥的。害人有可能終害己哦,小心被死纏爛打。下面開始學習吧.mm 你幾歲?mm測試你 我 你猜?我給她乙個圈套 mm 我猜你26 mm跳進圈套 我 實際上我30 她先跳了,所以我再跳 mm 你幾歲?mm測試你 我 ...

SQL注入原理,值得一看!

分類 sql 2013 07 25 14 16 88人閱讀收藏 舉報sql注入原理,值得一看!隨著b s模式應用開發的發展,使用這種模式編寫應用程式的程式設計師也越來越多。但是由於這個行業的入門門檻不高,程式設計師的水平及經驗也參差不齊,相當大一部分程式設計師在編寫 的時候,沒有對使用者輸入資料的合...