最常見的strncpy函式的缺陷, 0 問題

2021-10-19 22:21:17 字數 1325 閱讀 6587

想必大家經常會用到複製字串的函式吧,有時候不經意就會用到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 ...