执行strncpy

时间:2013-01-04 15:05:19

标签: c linux string gcc

我尝试过实施 string n copy 功能。我已经成功了,但我试图优化我的代码,但这种代码无效。

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;
}

3 个答案:

答案 0 :(得分:4)

这两个代码片段不等同:

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

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

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

另外需要注意的是strncpy背后的意图经常被误解:它是处理固定长度的字符串,而不是具有固定限制的可变长度字符串。这就是为什么你需要null结束从strncpy获得的结果:如果src字符串长于n个字符,结果字符串将不会以空值终止。< / p>

答案 1 :(得分:3)

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

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

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

您可以在man strncpy

查看示例实施

答案 2 :(得分:0)

你可以使用这个代码,越简单越好!

void Strncpy( char* _dst, const char* _src, size_t _n )
{
   size_t i = 0;
   while(i++ != _n && (*_dst++ = *_src++));
}