2016-06-30 3 views
1

Я должен написать программу для добавления элементов массива и удалить элементы из суммы, если предыдущий элемент равен 0, но я получаю ошибку времени выполнения как SIGSEGV. Как я могу решить эту проблему ошибка.Ошибка выполнения - 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; 
} 
+2

[Как отлаживать небольшие программы] (https://ericlippert.com/2014/03/05/how-to-debug-small -программы /). – s7amuser

+1

@Pleote Индексы массивов начинаются с 0. –

+1

Если размер массива 'arr' фиксирован при компиляции, почему вы просите пользователя ввести значение для' n'? Здесь вы должны использовать макрос. Читайте: http://c-faq.com/~scs/cclass/notes/sx9b.html. – babon

ответ

1

Проблема Вот размер массива. Вы объявили массив для размера 10, и если пользователь вводит размер 100, тогда появится такая ошибка времени выполнения. Чтобы избежать этого исключения просто объявить массив после пользователь вводит тебя размер ИЭ

 scanf("%d",&n); 
    int arr[n]; 
3

В этом заявлении

sum=sum-arr[i-1]; 

когда я равно 0 Вы пытаетесь получить доступ к памяти за пределами массива.

Удалить символ новой строки из зову зсапЕ

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 
+0

, если количество элементов массива является выбором пользователя, то как объявить длину массива в указанной выше программе @VIad из Москвы – Pleotex

+0

@Pleotex Если компилятор поддерживает VLA, тогда вы можете просто написать int a [n]; где n было введено до объявления. –

+0

@Pleotex В противном случае вы можете динамически выделять массив, используя malloc. –

Смежные вопросы