#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.