我们为什么不用strcpy函数
原因
很简单会溢出
man strcpy
使用strncpy代替?
可行,但也没那么安全
strncpy简单实现:
char *
strncpy(char *dest, const char *src, size_t n)
{
size_t i;
for (i = 0; i < n && src[i] != '\0'; i++)
dest[i] = src[i];
for ( ; i < n; i++)
dest[i] = '\0';
return dest;
}
当n > strlen(src)时会向dest中继续拷贝\0直到长度为n, 如果使用不规范n过大会出现溢出, 另外src长度大于或等于拷贝长度时不会在末尾拷贝'\0'。
安全的使用strncpy
方式一:
memset(dest, '\0', sizeof(dest));
strncpy(dest, src, sizeof(dest) - 1);
方式二:
strncpy(dest, src, sizeof(dest) - 1);
dest[sizeof(dest) - 1] = '\0';
更好的方案
snprintf(dest, sizeof(dest), "%s", src);
优点
- 没有
strcpy和strncpy的缺点 - 方便扩展
缺点
- 效率不如
strcpy和strncpy

浙公网安备 33010602011771号