linux strlcpy strncpy strcpy 和 sprintf 詳解

再linux 下字符串處理函數尤爲重要,下面我們就詳細簡介一下:

a) strcpy(dst,src) 這個函數是不檢查邊界的,他只把src copy 到dst 中如果 dst 長度不夠 就會發生內存踐踏,如 strcpy(buf[8],"123456789") 在這種狀況下 buf 中存的就是 12345678 而buf 就沒有字符串結束符了 \0 這回再字符串打印出現問題。

b) strncpy(dst,src,size)這個函數在有些情況下是會填補\0 的,但是他還是不會檢查呢邊界的。  一個前提是 size 的值一定是小於等於 dst的大小的。

    1. 當src 的大小比size 小時 這時會有\0 的, 應爲當src 的長度不夠size 時 他會用\0來補齊size 的長度的,所以這中情況下時安全的。 例如: strncpy(buf[8],"123456",8) 這是buf 存的時 "123456\0\0"

    2. 當dst 的長度與size 相等時 如果src 的長度比size 長或者相等時 這是 dst 中的字符串最後時沒有\0 的。例如: strncpy(buf[8],"123456789",8) 這時buf中村的是 "12345678"

    3. 當dst 的長度比size 長時 如果src 的長度比size長時 如果dst有初始化 則字符串有結尾符 \0   。例如: strncpy(buf[8],,"12345678",7) 這是村的是 “1234567\0”

 

strlcpy(dst,src,size) 這個函數是安全的他會copy size-1 個長度的src 到dst 中,前提也是dst的長度的大於等於size,例如: strlcpy(buf[8],"123456789",8) 這時buf 中存的是"1234567\0"

sprintf(buf,size,format,src)  這個函數和strncpy 是不同的他是安全的 他會 向buf中 格式輸入 size-1 的字符 並且在最後 補一個\0  l例如: sprintf(buf[8],8,"%s","1234567890") 這是buf 中存的是 "1234567\0"

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章