复制字符串的函数:strcpy与strcpy_s、strncpy与strncpy_s

前言

在VS2017中使用strcpy(strncpy)时,会遇到 This function or variable may be unsafe. Consider using strcpy_s instead 的报错,虽然网络上也有一些方法能略过该警告信息,但是既然编译器都推荐使用了更安全的strcpy_s,我们还是尊重一下编译器的想法。

本文将简要介绍标题中的四个函数:strcpy与strcpy_s、strncpy与strncpy_s的用法。

strcpy与strcpy_s

strcpy和strcpy_s都是C语言中的字符串复制函数。

strcpy的函数原型

char* strcpy(char* destination, const char* source);

其中,destination 是目标字符串,source 是源字符串。这个函数将源字符串中的内容复制到目标字符串中,直到遇到 '\0' 为止,返回目标字符串的指针。

strcpy使用示例

#include <iostream>
#include <cstring>

int main() {
    char src[] = "Hello, World!";
    char dest[20];
    
    strcpy(dest, src);
    
    std::cout << "拷贝后的字符串为:" << dest << std::endl;
    
    return 0;
}

strcpy_s的函数原型

注意,strcpy存在一个潜在的安全问题,即目标字符串的长度不够大,导致源字符串的内容无法完全复制到目标字符串中,从而可能引发缓冲区溢出和内存损坏等问题。

为了解决这个安全问题,C11标准引入了strcpy_s函数。

errno_t strcpy_s(char* destination, rsize_t destinationSize, const char* source);

其中,destination是目标字符串,destinationSize是目标字符串的大小,source是源字符串。这个函数在复制源字符串到目标字符串时会检查目标字符串的大小,如果目标字符串的大小不够大,就会返回一个错误码,并且不会进行复制操作。

需要注意的是,strcpy_s是C11标准中的函数,不是所有的编译器都支持该函数。

strcpy_s使用示例

#include <iostream>
#include <cstring>

int main() {
    char src[] = "Hello, World!";
    char dest[20];
    
    strcpy_s(dest, sizeof(dest), src);
    
    std::cout << "拷贝后的字符串为:" << dest << std::endl;
    
    return 0;
}

strncpy和strncpy_s

strncpy和strncpy_s也是C语言中的字符串复制函数,用于将一个字符串复制到另一个字符串中。

strncpy的函数原型

char* strncpy(char* destination, const char* source, size_t num);

其中,destination是目标字符串,source是源字符串,num表示要复制的字符个数。

这个函数将源字符串中的内容复制到目标字符串中,最多复制num个字符,如果源字符串的长度小于num,则会在目标字符串中剩余的位置填充'\0'。

注意,strncpy函数不保证目标字符串以'\0'结尾,如果源字符串的长度小于num,则会在目标字符串中剩余的位置填充'\0',这可能导致目标字符串没有正确的以'\0'结尾。

strncpy使用示例

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

int main() {
    char source[] = "Hello, world!";
    char destination[20];

    // 将source字符串的前10个字符复制到destination字符串中
    strncpy(destination, source, 10);
    destination[10] = '\0'; // 手动添加字符串结束符

    printf("复制的字符串为:%s\n", destination); // 输出:Hello, wor

    return 0;
}

strncpy_s的函数原型

errno_t strncpy_s(char* destination, rsize_t destinationSize, const char* source, rsize_t num);

其中,destination是目标字符串,destinationSize是目标字符串的大小,source是源字符串,num表示要复制的字符个数。

与strncpy类似,这个函数将源字符串中的内容复制到目标字符串中,最多复制num个字符,如果源字符串的长度小于num,则会在目标字符串中剩余的位置填充'\0'。

与strncpy不同的是,strncpy_s函数保证目标字符串以'\0'结尾,如果目标字符串的大小不够大,则会返回一个错误码,并且不会进行复制操作。

strncpy_s使用示例

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

int main() {
    char source[] = "Hello, world!";
    char destination[20];

    // 将source字符串的前10个字符复制到destination字符串中
    strncpy_s(destination, sizeof(destination), source, 10);

    printf("复制的字符串为:%s\n", destination); // 输出:Hello, wor

    return 0;
}
  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值