Почему он показывает ошибку sigsev в spoj ..??

#c #runtime-error #segmentation-fault

#c #время выполнения-ошибка #ошибка сегментации

Вопрос:

 ## Here is the link to the question http://www.spoj.com/problems/SBANK/
## i am getting sigsev error on the spoj.i have used mergesort to sort the account number ##


#include<stdio.h>
#include<string.h>
void merge(int,int,int);
char a[10000][33];
  

** Функция слияния для сортировки массива. Поскольку номер учетной записи превышает 18 цифр, я использовал функцию библиотеки строк для сравнения номеров учетных записей, хранящихся в строке **

  void mergesort(int low,int high)
{   int mid;

if(high>low)
{
     mid=(high low)/2;
    mergesort(low,mid);
    mergesort(mid 1,high);
    merge(low,mid,high);

}
else
    return;
}
void  merge(int low,int mid,int high)
{
int i=low;
int j=mid 1;
int k=0;

char temp[10000][33];

while(i<=midamp;amp;j<=high)
{
    if(strcmp(a[i],a[j])<0)
    {


        strcpy(temp[k],a[i]);
        i  ;

    }

    else
    {
       strcpy(temp[k],a[j]);
        j  ;

    }
    k  ;
}

while(i<=mid)
{
    strcpy(temp[k],a[i]);
    k  ;
    i  ;
}

while(j<=high)
{
   strcpy(temp[k],a[j]);
    k  ;
    j  ;
}
k=0;
    while(low<=high)
        {
            strcpy(a[low],temp[k]);
            low  ;
            k  ;
        }
}
  

Основная функция управления

В одном из интернет-банков ежедневно выполняются тысячи операций. Поскольку некоторые клиенты ведут бизнес более активно, чем другие, некоторые банковские счета встречаются много раз в списке операций. Ваша задача — отсортировать номера банковских счетов в порядке возрастания. Если учетная запись появляется в списке дважды или более, запишите количество повторений сразу после номера учетной записи. Формат счетов следующий: 2 контрольные цифры, 8-значный код банка, 16 цифр, идентифицирующих владельца (записанных группами по четыре цифры), например (в конце каждой строки ровно один пробел): 30 10103538 2222 1233 6160 0142

Банки — это учреждения реального времени, и им нужны БЫСТРЫЕ решения. Если вы чувствуете, что можете справиться с задачей в очень сжатые сроки, вперед! Хорошо разработанный алгоритм сортировки на быстром языке, скорее всего, будет успешным.

 int main()
{

int t;
scanf("%d",amp;t);
while(t--)
{
    int i,n;
    int ch;
    scanf("%d",amp;n);
    getchar();



   for(i=0;i<n;i  )
    gets(a[i]);
  printf("n");

    mergesort(0,n-1);

    int j=1;
    for(i=0;i<n-1;i  )
    {
        if(strcmp(a[i],a[i 1])==0)
        {   j  ;
           continue;
        }
        else
            {
        printf("%s %dn",a[i],j);
        j=1;
        }
    }
     printf("%s %dn",a[i],j);

}
return 0;

}

[Problem to sort bank accounts number of 26 digit][1]
  

Ответ №1:

Вероятно, один из ваших массивов фиксированного размера переполняется, если строки длиннее 32 символов или их более 10000.

Доступ к данным по индексу, который не был должным образом инициализирован, также может привести к чтению вне пределов.

Комментарии:

1. Хотя mergesort() это явно рекурсивно, если я не читаю код совершенно неправильно, не похоже, что когда-либо будет более одного экземпляра merge() active одновременно (похоже, это конечная функция, за пределами вызовов str*() ), поэтому рекурсивное накопление больших кадров стека, вероятно, не проблема. Тем не менее, 330 КБ по-прежнему является безумно большим стековым фреймом… Также есть много <= сравнений, которые заставляют меня с большим подозрением относиться к доступам к массиву за пределами…

2. @twalberg: Да, вы правы, merge не вызывается рекурсивно.

3. @twalberg Даже при использовании быстрой сортировки выдает ошибку времени выполнения. Помогите, пожалуйста!

4. @user3135098 Просить нас отладить вашу полную программу выходит за рамки этого сайта. Используйте отладчик или вставьте код трассировки, чтобы сузить область проблемы; затем, если у вас есть конкретный вопрос о том, почему что-то происходит так, как происходит, не стесняйтесь спрашивать.