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

2023-12-30 16:53:39

前言

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

文章来源:https://blog.csdn.net/Mako5455/article/details/135305695
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。