Программа получила сигнал SIGSEGV, Ошибка сегментации. # C ЯЗЫК # - PullRequest
0 голосов
/ 14 июля 2020

У меня программа получила сигнал SIGSEGV, ошибка сегментации. и я действительно не знаю, как это исправить, там говорится, что проблема в строке "scanf ("% s ", & t [i] .poste);"

#include <stdio.h>
#include <stdlib.h>

typedef struct { int d,m,y; } dtype ;

typedef struct { char nom[10]; char prenom[10] ; char poste[00]; dtype date ; } LEM ;

int main()
{
    int n,i,j;

    printf("Liste des employes\n");
    printf("\n nombre d'employes : ");
    scanf("%d",&n);

    LEM t[n];

    for(i=1;i<=n;i++)
    {
        printf("\nemploye number %d :",i);

        printf("\n nom : ");
        scanf("%s",&t[i].nom);

        printf("\n prenom : ");
        scanf("%s",&t[i].prenom);

        printf("\n poste : ");
        scanf("%s",&t[i].poste);

        printf("\n date de recrutement : ");

        printf("\n day : ");
        scanf("%d",&t[i].date.d);

        printf("\n month : ");
        scanf("%d",&t[i].date.m);

        printf("\n year : ");
        scanf("%d",&t[i].date.y);

    }

    for(i=1;i<=n;i++)
    {
        printf("nom : %s \t",t[i].nom);
        printf("prenom : %s \t",t[i].prenom);
        printf("poste : %s \t",t[i].poste);
        printf("date de rec : %d/%d/%d \t",t[i].date.d , t[i].date.m ,t[i].date.y);

    }
}

Ответы [ 2 ]

0 голосов
/ 14 июля 2020

Ваши for циклы должны начинаться с 0 и заканчиваться, когда i меньше n, так как индексирование массива начинается с 0. В ваших циклах сначала вы пропускаете первый элемент, а затем на последней итерации вы обращаются к недействительной памяти, и вы получаете ошибку сегментации.

Еще одна вещь, которую нужно изменить, - это то, как вы обрабатываете scanf -s. При чтении чего-либо в массив вы должны проверить, подходит ли то, что вы собираетесь поместить в массив. Что произойдет, если вы передадите в программу строку длиной более 9 символов? Это может вызвать переполнение массива и стать причиной другого сбоя сегментации.

0 голосов
/ 14 июля 2020

Если ваш код вставлен правильно, значит, вы установили poste равным нулю (в строке typedef struct { char nom[10]; char prenom[10] ; char poste[00]; dtype date ; } LEM ;). Может быть, вы имели ввиду 10 вместо 00?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...