复制字符串的函数: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;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!