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模式應用開發的發展,使用這種模式編寫應用程式的程式設計師也越來越多。但是由於這個行業的入門門檻不高,程式設計師的水平及經驗也參差不齊,相當大一部分程式設計師在編寫 的時候,沒有對使用者輸入資料的合...