0

読み取り用のファイルが与えられ、その内容をリンクされたリストに保存しました。

ファイル 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 はクラスが開催されないことを意味します) で構成され、その後にクラスの開始時刻と終了時刻を示す 2 つの軍事時間が続きます。

これまでのところ、私は持っています:

#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;
} 

文字列をトークン化した後、値を確認するために出力しました。strtok の後の printf は、最終的なコードには含まれません。

とにかく、私の出力は次のとおりです。

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

Segmentation fault

また、セグメンテーション違反がどこから来ているのか興味があります。それは私にはかなり頻繁に起こるようです。セグメンテーション違反とは何ですか? また、それを回避するにはどうすればよいですか? 上記の(ヌル)問題の一部ですか?

4

1 に答える 1

0

差し迫った問題の 1 つがここにあります。

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

火曜日の値を取得するための引数strtokは間違っています。

ただし、それ修正しても、次の理由により、各行を完全に読んでいるわけではありません。

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

のサイズはわずか 15であるため、このwhileループは完全な行を読み取ることはありません。buffer少なくとも、最長の行に改行と文字列ターミネータ用の数バイトを加えた大きさにする必要があります。

于 2016-04-26T09:21:13.830 に答える