【问题标题】:C Program to copy integer string using pointerC程序使用指针复制整数字符串
【发布时间】:2019-12-23 19:28:43
【问题描述】:

我试图将整数字符串复制到另一个字符串。当我尝试这样做时,它不会显示结果。你能告诉我我犯了什么错误吗?

 #include <stdio.h>

int main()
{
    int arr01[50],arr02[50];
    int *ptr01=arr01,*ptr02=arr02;
    int n,i;

    printf("Input array size:");
    scanf("%d",&n);


    for(i=0; i<n; i++)
    {
        scanf("%d",ptr01);
        ptr01++;
    }



    for(i=0; i<n; i++)
    {
        ptr02 = ptr01;
        ptr01++,ptr02++;
    }


    for(i=0; i<n; i++)
    {
        printf("%d",*ptr02);
    }


    return 0;
}

【问题讨论】:

  • ptr01++ 在循环之后,ptr01 已经指向第 n 个元素,因此您无法从那里开始复制。使用 ptr01=arr01 将其重置回数组的开头。接下来,ptr02 = ptr01 需要为 *ptr02 = *ptr01
  • 我做到了,但仍然没有显示正确答案
  • 最后一个循环也有同样的问题 - ptr02 已经指向第 n 个元素,需要重新设置。
  • 那我该怎么办?
  • 你为什么不好好想想呢?当然,您可以从 cmets 中学到一些东西,并找出如何至少取得进步。我告诉过你ptr02 不再指向数组的开头。那么如何让它回到起点,以便从那里开始打印呢?

标签: c arrays for-loop pointers copy


【解决方案1】:

在这个循环之前

for(i=0; i<n; i++)
{
    ptr02 = ptr01;
    ptr01++,ptr02++;
}

您必须重置指针ptr01 的值。 例如

ptr01 = arr01;

而不是

    ptr02 = ptr01;

你必须写

    *ptr02 = *ptr01;

在这个循环中

for(i=0; i<n; i++)
{
    printf("%d",*ptr02);
}

再次使用了指针ptr02的错误值,而且没有递增。

你必须写

ptr02 = arr02;

for(i=0; i<n; i++)
{
    printf("%d",*ptr02++);
}

如果你想处理指针,那么变量i 是多余的。

程序可以如下所示

#include <stdio.h>

int main()
{
    enum { N = 50 };

    int arr01[N], arr02[N];

    size_t n;

    printf( "Input array size: " );
    scanf( "%zu", &n );

    if ( N < n ) n = N;

    for ( int *ptr01 = arr01; ptr01 != arr01 + n; ++ptr01 )
    {
        scanf( "%d", ptr01 );
    }

    for ( int *ptr01 = arr01, *ptr02 = arr02; ptr01 != arr01 + n; ++ptr01, ++ptr02 )
    {
        *ptr02 = *ptr01;
    }

    for ( int *ptr02 = arr02; ptr02 != arr02 + n; ++ptr02 )
    {
        printf( "%d ", *ptr02 );
    }

    putchar( '\n' );

    return 0;
}

它的输出可能看起来像

Input array size: 5
1    
2
3
4
5
1 2 3 4 5

【讨论】:

    【解决方案2】:

    做了一些改变,你可以试试这个。我还在代码中使用了 cmets 来解释我为什么要进行这些更改

       #include <stdio.h>
    
    int main()
    {
    
    int arr01[50],arr02[50];
    
    int *ptr01=arr01,*ptr02=arr02;
    int n,i;
    
    printf("Input array size:");
    scanf("%d",&n);
    
    for(i=0; i<n; i++)
    {
        scanf("%d",ptr01);
        ptr01++;
    }
    
    ptr01=arr01; //ptr01 points the next element after nth element so we have to reset it to first element
    
    for(i=0; i<n; i++)
    {
        *ptr02 = *ptr01;
        ptr01++;
        ptr02++;
    }
    ptr02 = arr02; //ptr02 points the next element after nth element so we also have to reset it to first element
    
    for(i=0; i<n; i++){
        printf("%d",*ptr02++);
    }
    
    
    return 0;
    }
    

    【讨论】:

      【解决方案3】:

      你让这个问题变得比现在更难。首先,您需要丢失所有不必要的东西,例如arr02ptr02。试试这样的:

      #include <stdio.h>
      
      int main()
      {
          int arr01[50];
          int *ptr01=arr01;
          int n,i;
      
          printf("Input array size:");
          scanf("%d",&n);
      
      
          for(i=0; i<n; i++)
          {
              scanf("%d", ptr01);
              ptr01++;
          }
      
          ptr01 = arr01;
          for(i=0; i<n; i++)
          {
              printf("%d",*ptr01);
              ptr01++;
          }
      
      
          return 0;
      }
      

      而且我不应该告诉你声明一个固定大小的数组然后询问用户该数组有多大是多么糟糕的想法。如果用户输入 100 会怎样?

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-27
        • 2018-01-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多