首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >strncpy的实现

strncpy的实现
EN

Stack Overflow用户
提问于 2013-01-04 15:05:18
回答 3查看 14.2K关注 0票数 1

我尝试过实现字符串n复制函数。我已经成功了,但我试图优化我的代码,这是不起作用的。

代码语言:javascript
运行
复制
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字符串。

代码语言:javascript
运行
复制
char *my_strncpy(char *dst, const char*src, size_t n)
{
   char *temp = dst;
   while ((*dst++ = *src++) && (--n));
   return temp;
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-04 15:09:57

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

代码语言:javascript
运行
复制
while (n-- && (*dst++ = *src++))
    ;

不要把;放在行的末尾。在那里很容易被错过。

您可以在man strncpy上看到一个示例实现

票数 3
EN

Stack Overflow用户

发布于 2013-01-04 15:09:08

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

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

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

代码语言:javascript
运行
复制
for (; n-- ; *dst++ = '\0');

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

票数 6
EN

Stack Overflow用户

发布于 2018-02-24 20:42:57

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

代码语言:javascript
运行
复制
void Strncpy( char* _dst, const char* _src, size_t _n )
{
   size_t i = 0;
   while(i++ != _n && (*_dst++ = *_src++));
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14159625

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档