使用指针算术求和数字

时间:2018-05-03 13:00:26

标签: c pointers

我被赋予了一个编写代码的任务,该代码从用户输入数字作为输入并提供它的总和,特别是通过使用指针算法,即不允许使用数组下标[i]。

下面是我编写的代码,它已经编译甚至运行。但几乎总是它将输入数字的总和设为0.我试图解决它,但无济于事。因此,我正在寻求帮助,非常感谢任何帮助。

#include<stdio.h>
#define N 5

int sum_array( const int *p, int n)
{
 int  sum, a[N];
 sum = 0;

  for(p=&a[0]; p<&a[N]; p++)
  sum += *p;

 return sum;
 }


 int main()
{
  int a[N], *i,x;

  printf("Enter %d Numbers: ", N);

  for(i=a; i<a+N; i++)
   scanf("%d", i);
   // all the input values get scanned as i or the array a                    

   x= sum_array(i,N);                       
  printf("the sum  is %d\n", x);

  return 0;
   }

4 个答案:

答案 0 :(得分:1)

请注意,您要在int a[N]main中声明数组sum_array。它们位于不同的范围内,因此它们是不同的数组(来自sum_array的数组永远不会被初始化,因此读取它会调用未定义的行为)。

正确的方法是传递数组及其使用的长度:

这是一个固定版本:

#include<stdio.h>
#define N 5

int sum_array( const int *a, int n)    // a points to a array of at least n elements
{
 int  sum = 0;                         // initialize at definition time

  for(const int *p=a; p<&a[n]; p++)    // have the pointer p take all values from a
  sum += *p;

 return sum;
 }


 int main()
{
  int a[N], *i,x;

  printf("Enter %d Numbers: ", N);

  for(i=a; i<a+N; i++)
   scanf("%d", i);
   // all the input values get scanned as i or the array a                    

   x= sum_array(a,N);            // pass the array address, not a pointer past last element              
  printf("the sum  is %d\n", x);

  return 0;
}

最后这主要是品味问题,但我经常因为尝试在没有大括号的for循环中添加指令而被烧毁,因此我强烈建议使用始终大括号循环:

  for(i=a; i<a+N; i++) {
      scanf("%d", i);
  }

答案 1 :(得分:1)

int sum_array( const int *p, int n)
{
    int  sum = 0, i = 0;

    for(i = 0; i < n ; i++)
       sum += *(p+i);

    return sum;
}

int main(void)
{
   int a[N], i = 0, x = 0;

   printf("Enter %d Numbers: ", N);

   for(i=0; i<N; i++)
   scanf("%d", a+i);
   // all the input values get scanned as i or the array a                    

   x= sum_array(a,N);                       
   printf("the sum  is %d\n", x);


   return 0;
}

答案 2 :(得分:1)

x= sum_array(i,N); i中是循环的迭代器,所以在循环完成后它指向数组后面的第一个位置。

您应该传递原始数组x= sum_array(a,N);

在sum函数中,您只需丢弃传递的指针并将其替换为您的本地a[]

int sum_array( const int *p, int n)
{
  int sum = 0;
  int *end = &p[n]; // first element after the array.

  for(; p<end; p++) // just use p because you don't need the reference to the start of the array
  {
    sum += *p;
  }
  return sum;
}

但正如您所说,不允许使用数组表示法,您可以按如下方式更改

#include "stdio.h"

#define N 5

int sum_array( const int *p, int n)
{
  int sum = 0;
  const int *end = p+n; // first element after the array.

  for(; p<end; p++) 
  {
    sum += *p;
  }

  return sum;
}

 int main()
{
  int *a, *i, x;

  a = malloc(N * sizeof(*a));

  if (a == NULL)   
    exit(-1);

  printf("Enter %d Numbers: ", N);

  for(i=a; i<a+N; i++)
  {
    scanf("%d", i);
  }


   // all the input values get scanned as i or the array a                    

   x= sum_array(a,N);            // pass the array address, not a pointer past last element              
  printf("the sum  is %d\n", x);

  return 0;
}

答案 3 :(得分:0)

一般来说,编程时,代码应尽可能简单,同时仍然完整。

程序标准显示在将数字应用于数字之和后不需要保留数字。因此,在建议的代码中,输入数字仅保持足够长以应用于总和,然后将其丢弃。

以下提议的代码:

  1. 干净地编译
  2. 执行所需的功能
  3. 保持简单
  4. 正确检查;并处理任何错误
  5. 现在建议的代码:

    #include <stdio.h>    // scanf(), printf(), fprintf(), stderr
    #include <stdlib.h>   // exit(), EXIT_FAILURE
    
    #define N 5
    
    
    int main( void )
    {
        int num = 0;
        int sum = 0;
    
        printf("Enter %d Numbers: ", N);
    
        for(size_t i=0; i<N; i++)
        {
            if( scanf("%d", &num) != 1 )
            {
                fprintf( stderr, "failed to read number\n" );
                exit( EXIT_FAILURE );
            }
    
            // implied else, scanf successful
            sum += num;
        }
    
        printf( "the sum  is %d\n", sum );
    
        return 0;
    }