2013-08-06 2 views
0

Мне был предоставлен файл для чтения и хранения содержимого в связанном списке.Почему мой код возвращает (null), когда я его токенизу?

Файл schedule.csv является разделенными запятыми и содержит:

CSE1325.001,1,0,1,0,1,10:00,11:00 
CSE1325.002,0,1,0,1,0,12:30,14:00 
CSE2312.001,0,1,0,1,0,14:00,15:30 
CSE2315.001,1,0,1,0,1,09:00,10:00 
CSE2315.002,0,1,0,1,0,12:30,14:00 
ENGL1301.004,0,1,0,1,0,11:00,12:30 
HIST1311.001,0,0,0,0,1,13:00,16:00 
MATH1426.005,1,0,1,0,0,16:00,17:30 

Каждой строка состоит из ряда курса, 5 - 1-й или 0 (для понедельника до пятницы, 1 означает, что класс отвечает, 0 означает, что класс не встречается), а затем два военных раза, которые указываются, когда начинается класс и когда он заканчивается.

До сих пор у меня есть:

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

struct node 
{ 
     char course[15]; 
     int mon; 
     int tue; 
     int wed; 
     int thu; 
     int fri; 
     char start[10]; 
     char stop[10]; 
     struct node *next; 
}; 

typedef struct node link; 

link *addque(char *course, char *mon, char *tue, char *wed, char *thu, 
char *fri, char *start, char *stop); 


int main(void) 
{ 
     FILE *fp; 
     char *schedule = "schedule.csv"; 
     char buffer[15]; 
     char *course, *del = ","; 
     char *mon, *tue, *wed, *thu, *fri; 
     char *start, *stop; 
     link *head = NULL, *temp, *tail; 

     if((fp = fopen(schedule, "r")) == NULL) 
     { 
       printf("unable to open %s\n", schedule); 
       exit(1); 
     } 

     while(fgets(buffer, sizeof(buffer), fp) != NULL) 
     { 

/*---PROBLEM IS HERE!!!!---*/ 

       course = strtok(buffer, del); 
       mon = strtok(NULL, del); 
       tue = strtok(del, NULL); 
       wed = strtok(NULL, del); 
       thu = strtok(NULL, del); 
       fri = strtok(NULL, del); 
       start = strtok(NULL, del); 
       stop = strtok(NULL, del); 

/*---PROBLEM IS HERE!!!!---*/ 

       printf("\n\n%s,%s,%s,%s,%s,%s,%s,%s\n\n", course, mon, 
tue, wed, thu, fri, start, stop); 

        temp = addque(course, mon, tue, wed, thu, fri, 
    start, stop); 
        if(head == NULL) 
          head = temp; 
        else 
          tail->next = temp; 

       tail = temp; 
     } 
     fclose(fp); 
} 

link *addque(char *course, char *mon, char *tue, char *wed, char *thu, 
char *fri, char *start, char *stop) 
/********************************************** 
     name: addque 
     input: char *, 5x int *, 2x char *, course, days, times 
     output: struct node *, pointer to new node 
*/ 
{ 
     link *temp = malloc(sizeof(link)); 
     strcpy(temp->course, course); 
     strcpy(temp->start, start); 
     strcpy(temp->stop, stop); 
     temp->mon = atoi(mon); 
     temp->tue = atoi(tue); 
     temp->wed = atoi(wed); 
     temp->thu = atoi(thu); 
     temp->fri = atoi(fri); 
     temp->next = NULL; 

     return temp; 
} 

После того как я лексемы строки, я напечатал его, чтобы проверить значение. Printf после strtok's не будет в конечном коде.

Во всяком случае, мой вывод:

CSE1325.001,1,(null),(null),(null),(null),(null),(null) 

Segmentation fault 

Также любопытно, где вина Сегментация откуда. Это происходит со мной довольно часто. Что такое ошибка сегментации и как ее избежать? Является ли это частью (null) проблемы выше?

+0

Я также ограничен использованием C89. – user2657410

+0

Все должно компилироваться с помощью «gcc -std = c89 -pedantic MyCode.c» – user2657410

ответ

0

Непосредственным проблема, которая торчит здесь:

course = strtok(buffer, del); 
mon = strtok(NULL, del); 
tue = strtok(del, NULL);  // <<<< 

Ваши аргументы strtok для получения значения Вторник являются неправильный путь вокруг.

Однако даже когда вы исправить это, вы не читаете каждую полную строку, по следующим причинам:

char buffer[15]; 
: 
while(fgets(buffer, sizeof(buffer), fp) != NULL) 
: 

Это while цикл будет не прочитать полную строку, так как размер buffer всего пятнадцать. Вам нужно будет сделать его как минимум равной самой длинной строке плюс пару байтов для новой строки и ограничителя строк.

Смежные вопросы