C语言标准库函数strlcpy,是更加安全版本的 
 
中文名
strlcpy
外文名
strlcpy
功    能
字符串复制
头文件
string.h
返回值类型
size_t

C语言函数

编辑
函数原型声明:size_t strlcpy(char *dest, const char *src, size_t size)
头文件引用:#include <string.h>
功能: 在已知dest缓冲区大小并不会造成缓冲区溢出前提下,将src地址开始的字符串复制到以dest开始的地址空间
返回值:src字符串的大小
函数参数:参数dest为目的字符串开始的指针,src为源字符串的开始地址,参数size代表dest字符串的大小

功能说明

编辑
strlcpy函数创建的目的主要是针对strcpy函数缓冲区溢出的问题,因为一旦strcpy调用中src的字符串长度超过了dst的缓冲区大小,就会造成缓冲区安全漏洞问题,这是一类常见也严重的计算机安全漏洞。当然strcat函数也有安全版本的strlcat函数。

与strncpy区别

编辑
类似的函数还有strncpy,但是strlcpy常常是更加安全地选择,因为strlcpy在复制之后dst字符串一定会以'\0'字符结尾 [2]  。代码说明如下
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 库函数 - strlcpy() 和 strncpy() C 标准库 - <string.h>

描述

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

C 库函数 - strlcpy() 和 strncpy() C 标准库 - <string.h>

 
  • 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;
    }
  •  

    相关文章: