C語言 strcpy和strncpy的缺陷!

2021-10-21 15:12:22 字數 1654 閱讀 3820

strcpy()函式應該是我們用的比較常用的乙個函式,基本功能是將乙個字串拷貝到我指定的記憶體空間。但是要複製的字串長度超過這段記憶體空間的話,結果可能是未知的。

這是c語言裡面複製字串的庫函式, 函式宣告包括在專門處理字串的標頭檔案中:

char * strcpy( char * dst, const char * src );

這個函式把字串src複製到一分配好的字串空間dst中,複製的時候包括標誌字串結尾的空字元一起複製。操作成功,返回dst,否則返回null.

可以看到,執行strcpy函式時,它會將變數checkit的四個位元組也改寫了!(即checkit的第乙個位元組被重新賦值為了字元『b』,第二個位元組被重新賦值為了字元『c』;第乙個位元組被重新賦值為了字元『d』;第四個位元組被賦值為終止符0x00)。為什麼會這樣?

因為strcpy函式並不檢查目的緩衝區的大小邊界,而是將源字串逐一的全部賦值給目的字串位址起始的一塊連續的記憶體空間,同時加上字串終止符。

所以最後輸出變數checkin時,其值變為0x00646362,即其高兩位元組未變,最低位變為0x62即98,即字元b的ascii碼,第二低位元組變為0x63,即字元c的ascii碼,第三低位元組變為0x64,即字元d的ascii碼,最高位位元組變為0x00,即字串終止符。

所以,使用strcpy時容易出錯,不幸的是,這種bug是不易被發現的。所以需要格外的小心。為了避免出錯,可以使用c語言中另乙個具有相同功能的函式: strncpy,該函式可以指定要複製的字串的長度。

語法形式為:char *strncpy(char *dest, const char *src, int n),表示把src所指向的字串中以src位址開始的前n個位元組複製到dest所指的陣列中,並返回被複製後的dest。

易錯點

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』,避免出錯。

建議

優點:1、不需要手動新增』\0』.函式會複製n-1個字元,最後乙個字元新增』\0』。

2、函式的返回值是strlen(src),可直接判斷是否被截斷。

strlcpy

(path, src,

sizeof

(path));

len =

strlen

(path);if

( len >=

sizeof

(path)

)printf

("src is truncated."

);

用C語言實現strcpy函式和strncpy函式

內容會持續更新,有錯誤的地方歡迎指正,謝謝 strcpy函式 strcpy是c語言中的乙個複製字串的庫函式,手動實現如下 char strcpy char des,const char sourse 也許你們會有疑惑 p p為乙個指標。是這樣的,和 是同一優先順序的運算子,所以按照右結合性來看,先執...

c語言strcpy 用法

strcpy,即string copy 字串複製 的縮寫。strcpy是一種c語言的標準庫函式,strcpy把從src位址開始且含有 0 結束符的字串複製到以dest開始的位址空間,返回值的型別為char 定義乙個字串char a 20 和乙個字串c i am a teacher 把c複製到a中就可...

C語言 strcpy 函式

strcpy,即string copy 字串複製 的縮寫。strcpy是一種c語言的標準庫函式,strcpy把含有 0 結束符的字串複製到另乙個位址空間,返回值的型別為char c語言 strcpy 函式用於對字串進行複製 拷貝 標頭檔案 string.h 語法 原型 char strcpy cha...