我们为什么不用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);

优点

  • 没有strcpystrncpy的缺点
  • 方便扩展

缺点

  • 效率不如strcpystrncpy
posted @ 2020-08-31 12:44  爱弹钢琴的卡农  阅读(258)  评论(0)    收藏  举报