【问题标题】:Issue when implementing strcpy in C在 C 中实现 strcpy 时的问题
【发布时间】:2015-03-19 05:09:11
【问题描述】:

对于家庭作业,我应该实现 string.h 库 (2fun2handle) 的所有 22 个函数。我已经完成了很多功能,但是在尝试实现 strcpy 时遇到了一些麻烦。

经过多次修改,这是我对该功能的尝试:

char *new_strcpy(char *dest, const char *src){
    char *copy = (char *) src;
    for(; *copy != '\0'; ++copy, ++dest)
        *dest = *copy;
    return dest;
}

我认为这会很好。但是,通过执行如下简单示例来测试我的代码时:

char src[50], dest[50];
new_strcpy(src,  "src");
new_strcpy(dest,  "dest");
printf("dest: %s\n", dest);
printf("src: %s\n", src);

我的输出最终看起来像这样:

dest: dest$
src: src$$$$

什么时候应该是这样的:

dest: dest
src: src

在实现这个函数之前,我已经通过使用指针将 src 字符串复制到 dest 字符串没有问题。所以我不确定为什么现在会发生这种情况。有什么明显的我做错了吗?另请注意,我尝试使用 while 循环执行此操作并循环直到 *copy 为空,并且我尝试直接循环通过传入的原始 *dest 和 *src 参数。

【问题讨论】:

  • 您没有以空值终止目标 - for 循环中断并且您永远不会复制空值。
  • 您必须以空值终止您的字符串,方法是在循环后显式执行此操作或使用do ... while。 strcpy 返回dest 的(初始值)。您将指针返回到dest 字符串的末尾(这甚至可能是一个更有用的返回值)。
  • 没有真正回答你的问题,但我认为这种 strcpy 方法真的很酷:while(*dest++=*src++);

标签: c string strcpy


【解决方案1】:

您永远不会使用特殊的零字符将实际字符串标记为已完成:

char *new_strcpy(char *dest, const char *src){
    char *copy = (char *) src;
    for(; *copy != '\0'; ++copy, ++dest)
        *dest = *copy;
    *dest=0;
    return dest;
}

请注意,您不需要 copy 变量,它只是编译器将为您删除的垃圾。

编辑:根据要求,经典的strcpy 函数不会抛弃const 并且不那么冗长如下:

char *new_strcpy(char *dest, const char *src)
{
  char *ret = dest;            // needed to return, useless as this is
  while(*dest++ = *src++);     // straight byte copy, very unoptimized
  //*dest=0;                   // no longer needed since the copy happens before the check now
  return ret;                  // and return the original buffer (note that you were returning the end)
}

【讨论】:

  • 放弃const 限定符是非常糟糕的做法。既然你是正确的copy 变量是不必要的,我建议展示如何在没有它的情况下编写函数。
  • *dest = 0 实际上是作为终止字符还是我应该使用'\0'
  • @Alex '\0' 是等价于0的字符表示
  • @Alex 有些字符有特殊含义,'\0' 或“零”字符不能像字母或数字那样打印,它用于标记@987654332 的结束@.
  • while 循环终止因为终止的 0 已被复制。因此*dest = 0 是多余的(实际上是有害的,因为它修改了一个不必要的字符)。
猜你喜欢
  • 2013-01-06
  • 2013-10-18
  • 2021-08-12
  • 1970-01-01
  • 2020-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-08
相关资源
最近更新 更多