如何使用多个分隔符拆分输入?

时间:2014-12-12 14:23:08

标签: c arrays split

我想将一个lesson.txt文件拆分为令牌。这个文件有一些人和这些人的课程。我该怎么办?

有我的课程.txt文件:

George Adam            :Math,Science,Germany
Elizabeth McCurry      :Music,Math,History
Tom Hans               :Science,Music

首先,我想分成":"。我想将名称存储在数组中。其次,我想分成","这些课程我想存储一个不同的数组。我怎么能这样?

我的代码如下:

char names[100] , *token, *lecture;

file=fopen("C:\\lessons.txt","r");
while(!feof(file))
{
    fgets(names,sizeof(names),file);
    printf("%s",names);
    token=strtok(names,":");

    while(token!=NULL)
    {
        token=strtok(NULL,":");
        printf(" \n %s",token); 
        lecture=strtok(token,",");
        while(lecture!=NULL)
        {
            lecture=strtok(NULL,",");
            printf(" \n\n %s",lecture);
        }   
    }
}

fclose(file);

1 个答案:

答案 0 :(得分:1)

因此,您希望将名称存储在单独的数组中,并将课程存储在另一个数组中吗? 您将需要两个单独的标记,您使用相同的标记来表示名称和课程。 试试这个:

FILE *file;
file = fopen("C:\\lessons.txt", "r");
char names[100], *token, *difftok;
while (fgets(names, sizeof(names), file) != NULL) {
  token = strtok(names, ":")

  //puts(token); ---> George Adams

  difftok = strtok(NULL, ",");

  //puts(difftok); ---> Math

  difftok = strtok(NULL, ",");

  //puts(difftok);  ---> Science

  difftok = strtok(NULL, "\n");

  //puts(difftok);  ---> Germany
  }
  fclose(fp);
}

在我的摘录中,令牌将始终代表名称,而difftok将始终是讲座,从这里我想你可以弄清楚如何将令牌存储到数组中。 Token进入一个,difftok进入另一个。

此外,您的EOF条件错误,feof到达文件末尾时返回非零值:

while(!feof(file))

应该是:

while(feof(file) ==  0)

但是,在这种情况下,我使用了fgets(...)!= NULL,因为fgets在到达文件末尾时返回NULL。您可能应该使用我的条件,因为feof(file)== 0在与代码一起使用时遇到文件问题的一些结尾,并且会破坏令牌解析字符串的方式。