ошибка сегментации И СТРУКТУРА

#c

#c

Вопрос:

Моя цель — сохранить в структуре элементы в файле. Формат файла выглядит следующим образом:

XXXXX: TEMP>20: AC= ВЫКЛ
ГГГГ:TEMP<20: AC=ВКЛ (и т.д.)

Все, что я получаю, это ошибка сегментации (сброс ядра). Я предполагаю, что это из-за структуры. Код в while Я почти уверен, что он работает, но я могу ошибаться.

 char *rule=(char*)malloc(sizeof(char)*80);  
FILE *regra;
regra=fopen("SensorRules2.txt", "r ");


typedef struct r{

    char divisao[20];
    char sens[10];
    char op[2];
    int val;
    char atuadores[10];
    char estado[3];
}reg;



reg linha[42];
int l=0;

switch(atoi(MoteID)){
    case 1:

    while(fgets(rule, 80, regra)){

        strcpy(linha[l].divisao, strtok(rule, ":"));            
        aux=strtok(NULL, ":");
        strcpy(linha[l].sens, strtok(aux, ">"));
        strcpy(linha[l].op, ">");
        if(linha[l].sens == NULL){
         strcpy(linha[l].sens, strtok(aux, "<"));
         strcpy(linha[l].op, "<");
        }
        linha[l].val=atoi(strtok(NULL, ":"));
        strcpy(linha[l].atuadores, strtok(NULL, "="));
        strcpy(linha[l].estado, strtok(NULL, " "));

        l  ;
    }
  

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

1. strtok не является реентерабельным. Вы не можете обрабатывать две строки одновременно.

2. вы должны использовать strncpy, а не strcpy, чтобы избежать перезаписи буферов, выделенных в структуре.

3. … и вы не проверяете наличие NULL указателя, возвращаемого strtok , прежде чем он разыменуется strcpy .

4. Этот код не поддается анализу как есть из-за скрытых переполнений буфера. Замените strcpy на strncpy для всех этих копий в structs.