strlcpy和strncpy的参数,返回值,使用示例


其他避免缓冲区溢出的函数在我的其他文章有介绍,如snprintf(), strlcat(), strncat(),用法都比较类似

strlcpy()

strlcpy概述

strlcpy 是一个用于字符串复制的函数,与 strcpy 不同的是,它会在复制的同时确保目标缓冲区不会溢出。这是一个很有用的函数,因为它可以防止常见的缓冲区溢出问题。

函数签名如下:

size_t strlcpy(char *dst, const char *src, size_t size);
dst:目标缓冲区,用于存储源字符串 src 的副本。
src:源字符串,要复制的字符串。
size:目标缓冲区的大小,包括 null 终止符。
strlcpy 会将 src 字符串的内容复制到 dst 缓冲区中,但不会超过 size - 1 个字符。函数会确保在目标缓冲区的末尾添加 null 终止符,以确保结果是一个有效的 C 字符串。

strlcpy 函数的返回值是源字符串 src 的长度,即要复制的字符数(不含null)。这个返回值可以帮助你了解源字符串的长度,但不会告诉你实际写入目标缓冲区的字符数,因为可能会受到目标缓冲区大小的限制。

以下是一个使用 strlcpy 的示例:

#include <stdio.h>
#include <string.h>

int main() {
    char source[] = "Hello,world!";
    char destination[10];  // 目标缓冲区大小为10

    size_t copied_length = strlcpy(destination, source, sizeof(destination));

    printf("Copied string: %s\n", destination);// 输出是"Hello,wor"
    printf("Length of copied string: %zu\n", copied_length);//返回值是12

    return 0;
}

在这个示例中,source 字符串的内容被复制到了 destination 缓冲区中,由于 destination 的大小是 10,实际复制的字符数会受到限制。copied_length 变量将存储源字符串的长度, 返回值=sizeof(source) - 1。

使用注意事项:

  1. strlcpy 不是标准 C 函数,而是一些特定操作系统或库提供的函数(例如,BSD 系统和部分类 Unix 系统)。在某些情况下,这个函数可能不可用,或者需要链接到正确的库才能使用。虽然 strlcpy 可以防止缓冲区溢出,但它并不是标准 C 函数,只在一些特定的操作系统或库中提供。不同的系统可能会有不同的实现,因此在跨平台应用中需谨慎使用。
  2. 虽然 strlcpy 避免了缓冲区溢出,但仍然需要确保目标缓冲区足够大,以容纳源字符串。否则,复制操作仍可能会被截断。
  3. 返回的 copied_length 并不总是等于实际写入缓冲区的字符数,因为它受到目标缓冲区大小的限制。

strncpy()

strncpy概述

strncpy 是 C 标准库中的一个函数,用于将一个字符串的一部分复制到另一个字符串中,同时指定要复制的最大字符数。但是需要注意的是,strncpy 在处理目标缓冲区溢出时可能会有一些问题。

函数签名如下:

char *strncpy(char *dest, const char *src, size_t n);
dest:目标字符串,用于存储复制的内容。
src:源字符串,要复制的内容。
n:要复制的最大字符数。
strncpy 将 src 字符串的最多 n 个字符复制到 dest 中。如果 src 的长度小于 n,则剩余的空间将用 null 字符填充如果 src 的长度大于等于 n,则 dest 将不会以 null 终止。

strncpy 的返回值是 dest,即复制后的目标字符串的指针

以下是一个使用 strncpy 的示例:

#include <stdio.h>
#include <string.h>

int main() {
    char source[] = "Hello,world!";
    char destination[10];  // 目标缓冲区大小为10

    strncpy(destination, source, sizeof(destination) - 1);
    //destination[10]='\0'
    destination[sizeof(destination) - 1] = '\0';  // 手动添加 null 终止符
	//输出 Copied string: Hello,wor    
    printf("Copied string: %s\n", destination);
    

    return 0;
}

在这个示例中,strncpy 被用于复制源字符串的一部分内容,但是我们需要手动添加 null 终止符,以确保结果是一个有效的 C 字符串。如果源字符串的长度大于目标缓冲区的大小,复制后的字符串将不会以 null 终止,需要手动添加终止符。

使用注意事项:

strncpy 在复制完指定的字符数后并不会一定自动添加 null 终止符,这可能导致结果不是有效的 C 字符串。
当 src 的长度小于 n 时,strncpy 可能会在 dest 的剩余部分填充 null 字符,这可能导致结果字符串中包含不必要的 null 字符。
如果 src 的长度大于等于 n,dest 将不会以 null 终止,可能需要手动添加终止符。
考虑到 strncpy 的一些行为可能不够直观,可以使用更安全和可预测的函数,如 strlcpy 或者其他字符串操作函数。

总结:

  1. strncpy是c标准库文件,strlcpy是只在bds和个别unix系统上支持的库函数。
  2. strlcpy是不会产生缓冲区溢出的,strncpy如果 src 的长度小于 n,则剩余的空间将用 null 字符填充如果 src 的长度大于等于 n,则 dest 将不会以 null 终止(必须将第三参数定义小于等于sizeof(dest) -1,并手动设置最后一个字符为'\0')。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值