想必大家經常會用到複製字串的函式吧,有時候不經意就會用到strncpy(),我有時也有用到過,但是殊不知這個函式隱藏一些缺陷。先來了解strncpy吧
原型:
char *strncpy(char *dest, const char *src, size_t n)
引數:
dest – 指向用於儲存複製內容的目標陣列。
src – 要複製的字串。
n – 要從源中複製的字元數。
返回值:
最終複製的字串
ps:strncpy()不會向dest追加結束標記』\0』,這就引發了很多不合常理的問題.
strncpy複製後dest如果最後乙個沒有』\0』,用dest的時候沒有結束位置,後續對於字串的操作可能會造成記憶體的非法訪問.
如:printf("%s\n",dest);
這句話可能就會輸出一些不是你想要的結果。
標準用法
strncpy
(path, src,
sizeof
(path)-1
);path[
sizeof
(path)-1
]='\0'
;len =
strlen
(path)
;
手動的新增』\0』,避免出錯。
注意:
src 和 dest 所指的記憶體區域不能重疊,且 dest 必須有足夠的空間放置n個字元。但是也並不是說dest的空間越大就越好。
這個博主有詳細的舉例可以看一下
網上的其他博主也有發帖,可以使用strlcpy()代替strlcpy,這個函式相對於strncpy好用很多。
優點:1、不需要手動新增』\0』.函式會複製n-1個字元,最後乙個字元新增』\0』。
2、函式的返回值是strlen(src),可直接判斷是否被截斷。
strlcpy
(path, src,
sizeof
(path));
len =
strlen
(path);if
( len >=
sizeof
(path)
)printf
("src is truncated."
);
當然還有其他的一些字串拷貝函式,大家可以看看其他博主的。
本篇只是個人覺得自己之前沒有注意到的點,歡迎大佬的指點讓我進步,感謝感謝。
strncpy函式的用法
zz 利用標準庫函式strncpy 可以將一字串的一部分拷貝到另乙個字串中。strncpy 函式有3個引數 第乙個引數是目錄字串 第二個引數是源字串 第三個引數是乙個整數,代表要從源字串拷貝到目標字串中的字元數。以下是乙個用strncpy 函式拷貝字串的一部分的例子 include include ...
最常見的單詞
題目描述 給定乙個段落 paragraph 和乙個禁用單詞列表 banned 返回出現次數最多,同時不在禁用列表中的單詞。題目保證至少有乙個詞不在禁用列表中,而且答案唯一。禁用列表中的單詞用小寫字母表示,不含標點符號。段落中的單詞不區分大小寫。答案都是小寫字母。示例 輸入 paragraph bob...
819 最常見的單詞
給定乙個段落 paragraph 和乙個禁用單詞列表 banned 返回出現次數最多,同時不在禁用列表中的單詞。題目保證至少有乙個詞不在禁用列表中,而且答案唯一。禁用列表中的單詞用小寫字母表示,不含標點符號。段落中的單詞不區分大小寫。答案都是小寫字母。示例 輸入 paragraph bob hit ...