我尝试过实施 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;
}
答案 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++));
}