常见的字符串复制函数

来源:互联网 发布:js中如何定义数组 编辑:程序博客网 时间:2024/06/05 19:04

1.strcpy()函数
原型声明:char strcpy(char dest, const char *src);

功能:把从src地址开始且含有NULL结束符的字符串复制到以dest开始的地址空间
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
2.strcpy_s()
_s函数是微软自己加的, 不是标准库, 最直观的是C++下, 该函数不在std命名空间下.
_s函数要求传递数组时(比如字符串)需要额外传递一个参数表示缓存长度以免出错.
在文件头部添加 #define _CRT_SECURE_NO_WARNINGS 1
即可关闭vs的警告。(为了跨编译器允许,一般不使用strcpy_s函数,但在vs中会有警告,故使用宏定义消除警告。)
注意,strcpy_s有两个版本,一个可以帮助我们自动推断缓冲区的大小,而另外一个不能帮助我们推断,因此在编译器不能推断缓冲区大小的时候,我们需要自己指定缓冲区的大小,如下面的程序所演示的那样。

int main(){     char sz[128] = {0};     strcpy_s( sz, "Hello World!" );     cout<< sz << endl;     char* pSz2 = new char[128];     strcpy_s( pSz2, 128, "hello");     cout<< pSz2 << endl;     delete pSz2;    return 0;}

3 strnpy()

strncpy 是 C语言的库函数之一,来自 C语言标准库,定义于string.h,把src所指向的字符串中以src地址开始的前n个字节复制到dest所指的数组中,并返回dest。
函数原型char *strncpy(char *dest,char *src,size_t n);

(c/c++)复制字符串src中的内容(字符,数字、汉字….)到字符串dest中,复制多少由size_tn的值决定。
如果src的前n个字符不含NULL字符,则结果不会以NULL字符结束。如果n小于src的长度,只是将src的前n个字符复制到dest的前n个字符,不自动添加’\0’,也就是结果dest不包括’\0’,需要再手动添加一个’\0’。
如果src的长度小于n个字节,则以NULL填充dest直到复制完n个字节。src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符长度+’\0’。

一般情况下,使用strncpy时,建议将n置为dest串长度(除非你将多个src串都复制到dest数组,并且从dest尾部反向操作),复制完毕后,为保险起见,将dest串最后一字符置NULL,避免发生输出乱码问题。当然喽,无论是strcpy还是strncpy,保证dest串容量(能容纳下src串)才是最重要的。

4 strlcpy()

linux C语言标准库函数strlcpy,是更加安全版本的strcpy函数,在已知目的地址空间大小的情况下,把从src地址开始且含有’\0’结束符的字符串复制到以dest开始的地址空间,并不会造成缓冲区溢出。

函数原型声明:size_t strlcpy(char *dst, const char *src, size_t size)

功能: 在已知dest缓冲区大小并不会造成缓冲区溢出前提下,将src地址开始的字符串复制到以dest开始的地址空间
返回值:src字符串的大小
函数参数:参数dst为目的字符串开始的指针,src为源字符串的开始地址,参数size代表dst字符串的大小

原创粉丝点击