C-运行时错误-Sigsegv



我应该编写一个程序,以添加数组元素并从总和中删除元素,如果上一个元素为0/b>。我如何解决此错误。

#include <stdio.h>
int main()
{
    int i,arr[10],n,sum=0;
    scanf("%d",&n);
    for(i=0;i<n;i++)
    {
        scanf("%dn",&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;
}

在此语句中

sum=sum-arr[i-1];

当我等于0时,您正在尝试访问数组之外的内存。

从scanf

的呼声中删除新的线字符
scanf("%dn",&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 = %lldn", 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

这里的问题是数组的大小。您将大小为10的数组声明,如果用户将大小输入100,则将出现这种运行时间错误。为了避免此例外,只需在用户输入您的大小即

之后声明数组
     scanf("%d",&n);
     int arr[n];

最新更新