我应该编写一个程序来添加数组元素,如果前一个元素为0,则从总和中删除元素,但是我得到的运行时错误为 SIGSEGV 。我怎么能解决这个错误。
#include <stdio.h>
int main()
{
int i,arr[10],n,sum=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d\n",&arr[i]);
}
for(i=0;i<n;i++)
{
sum=sum+arr[i];
}
for(i=0;i<n;i++)
{
if(arr[i]==0)
{
sum=sum-arr[i-1];
}
}
printf("%d",sum);
return 0;
}
答案 0 :(得分:3)
在本声明中
sum=sum-arr[i-1];
当我等于0时,你试图访问数组之外的内存。
从scanf
的调用中删除换行符scanf("%d\n",&arr[i]);
^^
如果您要求用户输入数组的元素数,那么您应该检查输入的数字是否小于或等于10。 我认为要求用户输入数组元素的数量是没有意义的。否则,如果编译器支持它,最好使用可变长度数组。
程序可以按以下方式查看
#include <stdio.h>
#define N 10
int main( void )
{
int a[N];
printf( "Enter %d elements: ", N );
int n = 0;
while ( n < N && scanf( "%d", &a[n] ) == 1 ) n++;
long long sum = 0;
for ( int i = 0; i < n; i++ )
{
if ( i + 1 == n || a[i+1] != 0 ) sum += a[i];
}
printf( "\nsum = %lld\n", sum );
return 0;
}
例如,如果要输入以下数字序列
1 2 0 3 4 0 5 6 0 7
然后输出看起来像
Enter 10 elements: 1 2 0 3 4 0 5 6 0 7
sum = 16
答案 1 :(得分:1)
问题这是数组的大小。 您声明了大小为10的数组,如果用户输入的大小为100,则会出现此类运行时错误。 为避免此异常,只需在用户输入大小即
后声明数组 scanf("%d",&n);
int arr[n];