strncpy()
据说可以防止缓冲区溢出。但如果它在不添加空字符的情况下防止了溢出,很可能随后的字符串操作也会溢出。因此,为了防止这种情况,我发现自己要做:
strncpy( dest, src, LEN );
dest[LEN - 1] = '\0';
man strncpy
给出了如下信息:
strncpy()
函数与strcpy()
函数类似,不同之处在于只复制不多于n
个字节的src
。因此,如果在src
的前n
个字节中没有空字符,则结果将不会以空字符结尾。
如果没有添加空字符,即使是看似无害的东西也可能导致问题,比如:
printf( "FOO: %s\n", dest );
如果使用strncpy()
,会出现可能导致程序崩溃的情况。是否有更好、更安全的替代方法?
extern char *strncpy(char * restrict s1,const char * restrict s2,size_t n);
'的说明如下:strncpy()函数将最多n个字符从s2复制到s1中。如果s2少于n个字符,则s1的剩余部分将用`\0'字符填充。否则,s1不会被终止。 - Jonathan Leffler