字符串标记和C中的strstr - 分段错误

时间:2014-08-05 20:23:59

标签: c segmentation-fault token

我正在尝试阅读具有所有学位要求的文件。格式为

# means comments, and i am trying to avoid those
a main class,followed by the level(professional,preprofessional),and then all the pre-requisites,a bar separating multiple pre-requisites

所以这就是我试图阅读的文件看起来像

# courses required for BS Computer Science, 2012-2013 catalog
# course,category,prerequisites,notes
# preprofessional
ENGL 1301,preprofessional,none,none
ENGL 1302,preprofessional,none,none
MATH 1426,preprofessional,MATH 1323,none
MATH 2425,preprofessional,MATH 1426,none
PHYS 1443,preprofessional,MATH 1426,none
PHYS 1444,preprofessional,PHYS 1443|MATH 2425,none

当我标记并打印令牌时,我希望它能打印出像

这样的东西
Class is ENGL 1301 and level is preprofessional
prereqs are none, none,

Class is ENGL 1302 and level is preprofessional
prereqs are none,none,

Class is MATH 1426 and level is preprofessional
prereqs are MATH 1323, none,

但是以下代码是分段错误并且无法正常工作。我认为我的主要麻烦是试图过滤掉文件中的#。我使用strstr在缓冲区中查找它,如果找不到,继续标记每一行。这是我的代码

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

int main()
{
    FILE* fp = fopen("bscs-2014.csv","r");
    char* Class;
    char* level;
    char* prereq;
    char* token;
    char* del = ",|";
    char* ret;
    char buffer[1000];

    while( fgets(buffer, sizeof(buffer), fp) != NULL )
    {
        ret = strstr(buffer,"#");
        if(ret != NULL)
        {
            Class = strtok(buffer,del);
            level = strtok(NULL,del);
            printf("\nClass is %s level is %s\n",Class,level);

            while(token!= NULL)
            {
                token = strtok(NULL,del);
                printf("prereqs are %s, ",token);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:0)

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

int main(){
    FILE* fp = fopen("bscs-2014.csv","r");
    char *Class, *level, *prereq, *note;
    char *del = ",\n", *token;
    char ch;
    char buffer[1000];

    while( fgets(buffer, sizeof(buffer), fp) != NULL ){
        if(1==sscanf(buffer, " %c", &ch) && ch == '#')//if(*buffer == '#')
            continue;
        Class  = strtok(buffer, del);
        level  = strtok(NULL,   del);
        prereq = strtok(NULL,   del);
        note   = strtok(NULL,   del);

        printf("\nClass is %s level is %s.\n", Class, level);

        int i, count = 0;
        for(i=0;prereq[i];++i)
            count += (prereq[i] == '|');
        printf("prereqs %s ", count ? "are" : "is");
        char *pre[count+1];
        for(i=0, token=strtok(prereq, "|");token;token = strtok(NULL, "|"), ++i){
            printf("%s", pre[i]=token);
            if(i != count)
                printf(", ");
            else
                printf(".\n");
        }
        printf("note is %s.\n", note);
    }
    fclose(fp);
    return 0;
}