-
C 庫函數 -strlcpy
- 中文名
- strlcpy
- 外文名
- strlcpy
- 功 能
- 字符串復制
- 頭文件
- string.h
- 返回值類型
- size_ t
目錄
- 1 C語言函數
- 2 功能說明
- 3 與strncpy區別
函數原型聲明:size_t strlcpy(char *dest, const char *src, size_t size)
頭文件引用:#include <string.h>
返回值:src字符串的大小
函數參數:參數dest為目的字符串開始的指針,src為源字符串的開始地址,參數size代表dest字符串的大小
strlcpy函數創建的目的主要是針對strcpy函數
緩沖區溢出的問題,因為一旦strcpy調用中src的字符串長度超過了dst的緩沖區大小,就會造成緩沖區安全漏洞問題,這是一類常見也嚴重的計算機安全漏洞。當然strcat函數也有安全版本的strlcat函數。
1
2
3
4
5
6
7
8
9
10
|
#include <string.h>
#include <stdio.h>
int
main()
{
char
buf[5];
char
src[10] =
"12345678"
;
strlcpy(buf, src,
sizeof
(buf));
printf
(
"%s\n"
,buf);
//輸出1234
return
0;
}
|
上述示例中buf字符串最終結果是“1234\0”,以結束字符結尾,而如果同樣地情況下使用strncpy函數,代碼如下
1
2
3
4
5
6
7
8
9
10
|
#include <string.h>
#include <stdio.h>
int
main()
{
char
buf[5];
char
src[10] =
"12345678"
;
strncpy
(buf, src,
sizeof
(buf));
printf
(
"%s\n"
,buf);
return
0;
}
|
這個時候buf最終結果就是"12345",並沒有以結束字符結尾。
C 庫函數 - strncpy()
描述
C 庫函數 char *strncpy(char *dest, const char *src, size_t n) 把 src 所指向的字符串復制到 dest,最多復制 n 個字符。當 src 的長度小於 n 時,dest 的剩余部分將用空字節填充。
聲明
下面是 strncpy() 函數的聲明。
char *strncpy(char *dest, const char *src, size_t n)
參數
- dest -- 指向用於存儲復制內容的目標數組。
- src -- 要復制的字符串。
- n -- 要從源中復制的字符數。
返回值
該函數返回最終復制的字符串。
實例
下面的實例演示了 strncpy() 函數的用法。在這里,我們使用函數 memset() 來清除內存位置。
實例
#include <stdio.h>
#include <string.h>
int main() {
char src[40];
char dest[12];
memset(dest, '\0', sizeof(dest));
strcpy(src, "This is runoob.com");
strncpy(dest, src, 10);
printf("最終的目標字符串: %s\n", dest);
return(0);
}
讓我們編譯並運行上面的程序,這將產生以下結果:
最終的目標字符串: This is ru
strncpy 沒有自動加上終止符的,需要手動加上不然會出問題的。
/* strncpy 實例 */ #include <stdio.h> #include <string.h> int main () { char str1[]= "To be or not to be"; char str2[40]; char str3[40]; /* 拷貝到緩沖區: */ strncpy ( str2, str1, sizeof(str2) ); /* 拷貝 5 個字符: */ strncpy ( str3, str2, 5 ); str3[5] = '\0'; /* 手動加上終止符 */ puts (str1); puts (str2); puts (str3); return 0; }