strcpy与strncpy的区别

它们的区别主要在于对于目标字符串长度的处理

strcpy()函数将源字符串复制到目标字符串中,并在目标字符串的末尾添加一个'\0',表示字符串的结束。但是如果源字符串长度大于目标字符串长度,strcpy()函数将会发生缓冲区溢出的风险,这可能导致程序崩溃或者出现安全漏洞。

strncpy()函数也是将源字符串复制到目标字符串中,但是允许指定要复制的字符数。如果源字符串的长度大于指定的字符数,则目标字符串将被填充'\0'直到达到指定字符数,否则目标字符串不会以'\0'结束。

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

int main()
{
    char src[] = "Hello, world!";
    char dst1[6];
    char dst2[6];
    
    // 使用strcpy()函数拷贝字符串
    strcpy(dst1, src);
    printf("dst1: %s\n", dst1);  // 输出结果:Hello, world!
    
    // 使用strncpy()函数拷贝字符串
    strncpy(dst2, src, 5);
    //dst2[5] = '\0';
    printf("dst2: %s\n", dst2);  // 输出结果:Hello 可能+ 乱码
    
    return 0;
}

 

使用strcpy()函数将源字符串source复制到目标字符串dst1中,因为dst1的长度只有6个字符,所以该操作会导致缓冲区溢出。在实际运行中,程序可能会崩溃或者出现安全漏洞

 使用strncpy()函数将源字符串src的前5个字符复制到目标字符串dst2中。因为dst2的长度也是6个字符,所以函数在复制完前5个字符后就结束了,不会发生缓冲区溢出。dst2没有以'\0'结尾,这可能会导致在一些字符串操作中出现问题。

1.字符串长度计算错误:许多字符串操作函数,如strlen()strcpy()strcat()等,都是通过遍历字符串,找到字符串中的'\0'字符来确定字符串的长度或位置的

2.无法正确打印或显示字符串:许多输出函数,如printf()puts()等,也是通过遍历字符串并输出其中的字符,直到遇到'\0'字符来输出字符串的。如果没有以'\0'结尾,这些函数就会继续遍历内存,直到找到'\0'或者访问了非法内存位置,从而可能导致程序崩溃或者产生意外的结果。

3.无法正确比较字符串:许多字符串比较函数,如strcmp()strncmp()

 

对于 C++ 标准库中的字符串(std::string),其长度信息由字符串对象自己维护,因此不需要以 '\0' 结尾。在 C++ 中,可以通过 std::string 对象的 size() 方法获取字符串的长度,也可以直接使用字符串对象来进行字符串拼接、字符串比较等操作,不需要使用 C 风格字符串中的操作函数,从而避免了上述问题。

对于 C 风格字符串,在 C++ 中仍然可以使用,但需要注意字符串的正确结尾。由于 C++ 中新增了一些安全的字符串操作函数,如 strncpy_s()strcpy_s() 等,可以在编译时检测到字符串操作的安全性,因此可以避免 C 语言中可能会出现的缓冲区溢出等问题。但是,这些函数在某些编译器中可能不被支持,因此如果需要使用 C 风格字符串,建议手动保证字符串正确结尾,以避免潜在的问题

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值