我尝试过实现字符串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;
}
发布于 2013-01-04 15:09:57
第二个版本不起作用,因为它可能超出了n
。把n == 0
测试拉在前面
while (n-- && (*dst++ = *src++))
;
不要把;
放在行的末尾。在那里很容易被错过。
您可以在man strncpy
上看到一个示例实现
发布于 2013-01-04 15:09:08
这两个代码片段不是等价的:
n
字符,而不考虑字符串的内容;n
字符时立即停止,以第一个字符为准。第一个实现和第二个实现都不等同于标准库中的strncpy
,后者将复制到终止符,然后继续用零填充剩余的空间。要使您的函数符合标准,请在return
语句之前添加以下行:
for (; n-- ; *dst++ = '\0');
另外要注意的是,strncpy
背后的意图经常被误解:它的目的是处理固定长度的字符串,而不是固定限制的可变长度字符串。这就是为什么您需要空终止从strncpy
获得的结果:如果src
字符串比n
字符长,则得到的字符串不会以空结尾。
发布于 2018-02-24 20:42:57
您可以使用这段代码,越简单越好!
void Strncpy( char* _dst, const char* _src, size_t _n )
{
size_t i = 0;
while(i++ != _n && (*_dst++ = *_src++));
}
https://stackoverflow.com/questions/14159625
复制相似问题