Member 13803277 Ответов: 1

Ошибка сегментации в C, запутался, что происходит не так


При отправке кода его окончание приводит к ошибке сегментации , например переполнению стека

Что я уже пробовал:

#include<stdio.h>
int main()
{
    int twen=0,nine=0,other=0,n;
    char cd[1000];
    scanf("%d",n);
    while(n--)
    {
    gets(cd);
    
    if(cd[0] == 'G')
    {
        for(int i=0;cd[i]!='\0';i++)
        {
            if((cd[i]=='1') && (cd[i+1] == '9'))
            {
                nine+=2;
            }
            else if((cd[i]=='2') && (cd[i+1] == '0'))
            {
                twen+=2;
            }
            else if((cd[i]>2) && (cd[i+1]<9))
            {
                other+=2;
            }
        }
    }
      if(cd[0] == 'M')
    {
        for(int i=0;cd[i]!='\0';i++)
        {
            if((cd[i]=='1') && (cd[i+1] == '9'))
            {
                nine+=1;
            }
            else if((cd[i]=='2') && (cd[i+1] == '0'))
            {
                twen+=1;
            }
            else if((cd[i]>'2') && (cd[i+1]<'9'))
            {
                other+=1;
            }
        }
    }
    }
    if(nine>twen)
    printf("Date\n");
    else if(other > twen || other > nine)
    printf("No Date\n");
    else
    printf("No Date\n");
    return 0;
}

Patrice T

То, что должно быть входным сигналом.

1 Ответов

Рейтинг:
2

OriginalGriff

Мы не можем сказать вам - у нас нет доступа к вашим данным, поэтому мы не можем попробовать ваш код точно в тех же условиях, что и вы, - и это почти наверняка будет связано с данными.
Но это в вашем первом случае for петля:

else if((cd[i]>2) && (cd[i+1]<9))
Наверное, так и должно выглядеть во второй раз.:
else if((cd[i]>'2') && (cd[i+1]<'9'))
Это не исправить, хотя ваши проблемы!

Однако, вероятно, вы бежите с конца своего массива cd.

Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Как вы его используете, зависит от вашей системы компилятора, но быстрый поиск в Google имени вашей IDE и "отладчика" должен дать вам необходимую информацию.

Поместите точку останова в первую строку функции и запустите код через отладчик. Затем посмотрите на свой код и на свои данные и определите, что должно произойти вручную. Затем по одному шагу в каждой строке проверяйте, что то, что вы ожидали, произойдет именно так, как и произошло. Когда это не так, тогда у вас есть проблема, и вы можете вернуться назад (или запустить ее снова и посмотреть более внимательно), чтобы выяснить, почему.

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!