strncpy的实现

Rag*_*ddy 1 c linux string gcc

我曾尝试实现字符串 n 复制功能。我已经成功了,但我试图优化我的代码,但它不起作用。

char *mystrncpy(char *dst, const char *src, size_t n)
{
   int i;
   char *temp;
   temp = dst;  
   for (i = 0; i < n; i++)
      *dst++ = *src++;
   return temp;
}
Run Code Online (Sandbox Code Playgroud)

上面的代码工作正常。

但是下面的有一些问题。它只是srcn我传递的任何值返回字符串。

char *my_strncpy(char *dst, const char*src, size_t n)
{
   char *temp = dst;
   while ((*dst++ = *src++) && (--n));
   return temp;
}
Run Code Online (Sandbox Code Playgroud)

das*_*ght 6

这两个代码片段是不等价的:

  • n无论字符串的内容如何,第一个都会遍历并复制所有字符;
  • 第二个在复制空终止符后或复制n字符后立即停止,以先到者为准。

第一个和第二个实现都不等同于strncpy来自标准库,它复制到终止符,然后继续用零填充剩余空间。要使您的函数符合标准,请在return语句前添加以下行:

for (; n-- ; *dst++ = '\0');
Run Code Online (Sandbox Code Playgroud)

另一件需要注意的是,背后的意图strncpy经常被误解:它是用来处理固定长度的字符串,而不是具有固定限制的可变长度字符串。这就是为什么您需要对从中获得的结果进行空终止strncpy:如果src字符串比n字符长,则结果字符串不会以空终止。