C 库函数 - strlcpy() 和 strncpy()
-
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; }