1

我已经尝试实现字符串 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;
}

上面的代码工作正常。

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

char *my_strncpy(char *dst, const char*src, size_t n)
{
   char *temp = dst;
   while ((*dst++ = *src++) && (--n));
   return temp;
}
4

3 回答 3

6

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

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

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

for (; n-- ; *dst++ = '\0');

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

于 2013-01-04T15:09:08.523 回答
3

第二个版本不起作用,因为它可能会超出n. 将测试拉到n == 0前面

while (n-- && (*dst++ = *src++))
    ;

并且不要将 the;放在行尾。那里很容易错过。

您可以在以下位置查看示例实现man strncpy

于 2013-01-04T15:09:57.710 回答
1

您可以使用此代码,越简单越好!

void Strncpy( char* _dst, const char* _src, size_t _n )
{
   size_t i = 0;
   while(i++ != _n && (*_dst++ = *_src++));
}
于 2018-02-24T20:42:57.943 回答