【问题标题】:Custom strcpy is compiling fine, but not working properly自定义 strcpy 编译正常,但无法正常工作
【发布时间】:2014-04-06 21:58:24
【问题描述】:

我正在做一个 C 任务,基本上是在制作我们自己的 C 字符串类。我和我的搭档相信我们的逻辑是正确的并且我们的源文件正在编译,但是我们无法在一个简单的主文件上获得任何输出。

我们的strcpy如下:

...
char *my_strcpy(char *s1, const char *s2)
{
    int r=0;    
    for (int i=0;s2[i]!='\0'; i++)
    {
        s1[i]=s2[i];
        r++;
    }
    s1[r+1]='\0';
    return s1;  
}
...

至于我们的主文件:

...
const char *hello = "Hello World! ";
char pointer[1024];

my_strcpy(pointer, hello);
printf("%s\n", pointer);
...

任何帮助将不胜感激! 谢谢!

【问题讨论】:

  • 删除*。和r+1 --> r
  • 哦,对不起。我放了一个旧版本。我更新的一个在我们的 unix 服务器上。现在更新。

标签: c string pointers char strcpy


【解决方案1】:

修改代码

char *my_strcpy(char *s1, const char *s2)
{
    int r=0;    
    for (int i=0;s2[i]!='\0'; i++)
    {
        s1[i]=s2[i];
        r++;
    }
    s1[r+1]='\0';
    return s1;  
}

修改后的答案

您不需要ri。您在 s1[r+1] = '\0'; 处遇到了一个错误。

工作代码

对问题的原始版本和修订版本都正确。

char *my_strcpy(char *s1, const char *s2)
{
    int i;    
    for (i = 0; s2[i] != '\0'; i++)
        s1[i] = s2[i];
    s1[i] = '\0';
    return s1; 
}

原码

char *my_strcpy(char *s1, const char *s2)
{
    int r=0;    
    for (int i=0;*s2[i]!='\0'; i++)
    {
        *s1[i]=*s2[i];
        r++;
    }
    *s1[r+1]='\0';
    return *s1; 
}

原答案

代码不应该在没有大量警告的情况下编译(实际上,它们应该是错误)。

在整个代码中,符号:

*s1[i]

正在取消引用一个字符,就好像它是一个字符指针。

您在*s[r+1] = '\0'; 中也“一败涂地”

您将char 作为char * 返回。

您实际上并不需要ir

【讨论】:

    【解决方案2】:

    你的代码有很多错误:

    编译错误:

    1. my_strcpy 需要返回 char:char* 的指针,但你返回的是 char。

    逻辑错误:

    1. s2[i]!='\0'是对的

    所以您的代码可能如下所示:

    char *my_strcpy(char *s1, const char *s2)
    {
        int r=0;    
        for (int i=0;s2[i]!='\0'; i++)
        {
            s1[i]=s2[i];
            r++;
        }
        s1[r]='\0';
        return s1; 
    }
    

    我想你对 C 中的指针并不熟悉。

    【讨论】:

      【解决方案3】:

      你正在返回*s1,它应该是s1,因为你需要返回一个指针。

      【讨论】:

      • 编译器应该会抱怨类型不匹配。
      【解决方案4】:

      首先,一个编码错误,您在 for 循环中定义 int i = 0。在函数中执行任何其他操作之前,应定义所有变量。

      其次,您要复制最后一个字符,即 'r' 处的空字符。您的循环递增 r 直到找到一个空字符,那么为什么要将空字符放在找到它的位置之后呢?改成 s1[r]='\0';

      我注意到您的 my_strcpy 函数的一件事是您正在返回 s1,但是当您调用 my_strcpy 时,您并没有将返回值分配给指针。这很好,因为您的第一个参数是“输出”,因为您传入了一个指针。我会让 my_strcpy return void 并摆脱 return s1;排在一起。

      总的来说,my_strcpy 看起来像这样

      void my_strcpy(char *s1, const char *s2)
      {
          int r = 0;
          int i = 0;
          for (i = 0; s2[i] != '\0'; i++)
          {
              s1[i] = s2[i];
              r++;
          }
          s1[r] = '\0';
      }
      

      【讨论】:

      • 欢迎来到 Stack Overflow。请尽快阅读About 页面。请注意,C11 和 C99 允许您在 for 循环的第一个子句中定义变量,尽管 C89 不允许(MSVC 仍然不允许,因为它是 C89 编译器)。在您修改后的代码中,r 何时不等于 i?既然如此,为什么你们两个都有?
      猜你喜欢
      • 2017-12-15
      • 1970-01-01
      • 2016-07-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多