STRCPY - Linux手册页

时间:2019-08-20 18:01:23  来源:igfitidea点击:

Linux程序员手册 第3部分
更新日期: 2019-03-06

名称

strcpy,strncpy-复制字符串

语法

#include <string.h>

char *strcpy(char *dest, const char *src);

char *strncpy(char *dest, const char *src, size_t n);

说明

strcpy()函数将src指向的字符串(包括终止的空字节(aq \ 0aq))复制到dest指向的缓冲区。字符串可能不会重叠,并且目标字符串dest必须足够大才能接收副本。当心缓冲区溢出! (请参阅错误。)

strncpy()函数类似于,但最多复制了src个n字节。警告:如果src的前n个字节中没有空字节,则放置在dest中的字符串将不会以空值结尾。

如果src的长度小于n,则strncpy()将其他空字节写入dest以确保总共写入n个字节。

strncpy()的简单实现可能是:

char *
strncpy(char *dest, const char *src, size_t n)
{
    size_t i;

    for (i = 0; i < n && src[i] != aq
if (buflen > 0) {
    strncpy(buf, str, buflen - 1);
    buf[buflen - 1]= aq##代码##aq;
}
aq; i++) dest[i] = src[i]; for ( ; i < n; i++) dest[i] = aq##代码##aq; return dest; }

返回值

strcpy()和strncpy()函数返回一个指向目标字符串dest的指针。

属性

有关本节中使用的术语的说明,请参见attribute(7)。

InterfaceAttributeValue
strcpy(),strncpy()Thread safetyMT-Safe

遵循规范

POSIX.1-2001,POSIX.1-2008,C89,C99,SVr4、4.3BSD。

备注

一些程序员认为strncpy()效率低下且容易出错。如果程序员知道(即包括要测试的代码!)dest的大小大于src的长度,则可以使用strcpy()。

strncpy()的一种有效(和预期的)用法是将C字符串复制到固定长度的缓冲区中,同时确保缓冲区不溢出并且目标缓冲区中未使用的字节清零(也许可以防止信息泄漏缓冲区将通过进程间通信技术写入媒体或传输到另一个进程)。

如果src的前n个字节中没有终止的空字节,则strncpy()会在dest中生成一个未终止的字符串。如果buf的长度为buflen,则可以使用以下命令强制终止:

##代码##

(当然,以上技术忽略了以下事实:如果src包含buflen-1个字节以上的字节,则信息在复制到dest中会丢失。)

strlcpy()

某些系统(BSD,Solaris和其他系统)提供以下功能:

size_t strlcpy(char * dest,constchar * src,size_tsize);

此函数类似于strncpy(),但它最多将1个字节复制到dest,始终添加一个终止的空字节,并且不使用(更多)空字节填充目标。此函数解决了strcpy()和strncpy()的一些问题,但是如果大小太小,调用方仍必须处理数据丢失的可能性。该函数的返回值是src的长度,它使截断易于检测:如果返回值大于或等于size,则发生截断。如果数据丢失很重要,则调用者必须在调用之前检查参数,或者测试函数的返回值。 strlcpy()在glibc中不存在,并且未由POSIX标准化,但可通过libbsd库在Linux上使用。

BUGS

如果strcpy()的目标字符串不够大,则可能会发生任何事情。固定长度的字符串缓冲区溢出是用于完全控制机器的最受欢迎的破解技术。每当程序读取数据或将数据复制到缓冲区中时,程序首先需要检查是否有足够的空间。如果您可以证明不可能发生溢出,则这可能是不必要的,但请注意:程序可能会随着时间的流逝而改变,以可能的方式使不可能发生。

另外参见

bcopy(3),memccpy(3),memcpy(3),memmove(3),stpcpy(3),stpncpy(3),strdup(3),string(3),wcscpy(3),wcsncpy(3)

出版信息

这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/