【问题标题】:Copying array to array using pointer使用指针将数组复制到数组
【发布时间】:2018-04-26 04:12:44
【问题描述】:

就像下面的一个问题,我必须使用指针概念在 mystrcpy2 函数中将数组从一个复制到另一个,这与不使用指针概念的 mystrcpy 函数不同。无论如何,我输入了我的答案,“dest = src;”这对我来说似乎过于简单但正确的答案。但是当我输入诸如“Hello World”之类的输入时,它会显示为“Hello World ???”就像后面的奇怪字母。但是当我输入像“abc”这样的短词时,结果就是“abc”。 是电脑问题还是我做错了什么?

我还想知道“while (*src) *dest++=*src++;”是否也有效?

/*完成mystrcpy2()函数,将src指向的空终止字符串复制到dest指向的字符串。 mystrcpy2() 应该与使用基于索引的数组遍历方法的 mystrcpy() 给出相同的结果。 请注意,在实现 mystrcpy2() 时不允许添加局部变量。 编写并提交“mystrcpy2()”函数的源代码。 */

#include <stdio.h>
void mystrcpy(char dest[], char src[])
{
    int i=0,j=0;
    while (src[i])
        dest[j++] = src[i++];
}
void mystrcpy2(char *dest, char *src)
{
    dest = src;
}

int main(void)
{
    char mystr1[256];
    char mystr2[256];

    gets(mystr1);

mystrcpy(mystr2, mystr1);
puts(mystr2);

    mystrcpy2(mystr2, mystr1);
    puts(mystr2);
    return 0;
}

【问题讨论】:

    标签: c arrays pointers strcpy


    【解决方案1】:

    mystrcpy2 的实现不会复制任何内容。事实上,它什么也没做。当您执行dest = src 时,您正在复制src 变量指向的内存位置,而不是该位置的数据。要实际复制数据,您需要使用“*”来尊重指针。所以你会这样做

    *dest = *src;
    

    这会将数据从src 复制到dest。但它只复制一个字符。您需要增加srcdest,然后再次执行此操作以复制下一个字符,并且您需要继续执行此操作,直到您点击字符串终止符,即直到*src == 0。这是完整的实现。

    void mystrcpy2(char *dest, char *src)
    {
        while (*src != 0) {
            *dest = *src;
            dest++;
            src++;
        }
        // don't forget to add a terminator
        // to the copied string
        *dest = 0;
    }
    

    在一个较短的版本中,这是完全相同的东西。

    void mystrcpy2(char *dest, char *src)
    {
        while (*(dest++) = *(src++));
    }
    

    【讨论】:

      【解决方案2】:
      void mystrcpy2(char *dest, char *src)
      {
          dest = src;
      }
      
      main()
      {
      ...
      mystrcpy2(mystr2, mystr1);
      ...
      }
      

      当您调用mystrcpy2(mystr2, mystr1); 并在mystrcpy2 中执行dest = src 时,这不会影响main 中的mystr2 指针。

      如果你想在 main 中改变 mystr2,你应该这样做:

      main() {
        char mystr1[256];
        char **mystr2;
        ...
        mystrcpy2(mystr2, mystr1);
        puts(*mystr2);
      }
      
      void mystrcpy2(char **dest, char *src)
      {
          *dest = src;
      }
      

      另一方面,在其他版本的 strcpy 中,您不需要 2 个局部变量,只需 1 个就足够了。

      void mystrcpy(char dest[], char src[])
      {
          int i;
          for(i=0;src[i];i++)
              dest[i] = src[i];
      }
      

      甚至没有:

      void mystrcpy(char *dest, char *src)
      {
          while(*src)
              *dest = *src, dest++, src++;
      }
      

      (在这种情况下,参数被声明为指针,以便可变)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-05-08
        • 2018-01-09
        • 1970-01-01
        • 1970-01-01
        • 2020-11-04
        • 2014-06-20
        • 2023-03-08
        相关资源
        最近更新 更多