我被赋予了一个编写代码的任务,该代码从用户输入数字作为输入并提供它的总和,特别是通过使用指针算法,即不允许使用数组下标[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;
}
答案 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)
一般来说,编程时,代码应尽可能简单,同时仍然完整。
程序标准显示在将数字应用于数字之和后不需要保留数字。因此,在建议的代码中,输入数字仅保持足够长以应用于总和,然后将其丢弃。
以下提议的代码:
现在建议的代码:
#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;
}