如何在C中正确分割?

时间:2014-12-14 14:24:31

标签: c arrays split

我想拆分一个包含文本文件信息的数组。首先,我拆分然后插入一个节点。我写了一些东西,但仍然有错误。你能帮我吗?

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

struct person
{
  char *lesson;
  char *name;
  struct person *next;
};

char *
strtok_r (char *str, const char *delim, char **save)
{
  char *res, *last;

  if (!save)
    return strtok (str, delim);
  if (!str && !(str = *save))
    return NULL;
  last = str + strlen (str);
  if ((*save = res = strtok (str, delim)))
    {
      *save += strlen (res);
      if (*save < last)
        (*save)++;
      else
        *save = NULL;
    }
  return res;
}


int
main ()
{

  FILE *fp;
  char names[100][100];
  fp = fopen ("C:\\lesson.txt", "r");

  int i = 0, j = 0;
  while (!feof (fp))
    {
      //fscanf(fp,"%s",names[i]);
      fgets (names[i], sizeof (names), fp);
      i++;
    }
  for (j = 0; j < 10; j++)
    {
      char *key_value;
      char *key_value_s;

      key_value = strtok_r (names[j], ":", &key_value_s);

      while (key_value)
        {
          char *key, *value, *s;

          key = strtok_r (key_value, ":", &s);
          value = strtok_r (NULL, ",", &s);

          key_value = strtok_r (NULL, ",", &key_value_s);
          insertion (key_value);
        }
    }
}

并且有我的lesson.txt文件:

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

我想分割名称和课程,我想插入课程。但我只能插入名字。我使用strtok_r,但我认为它无法正常工作。因为我确信我的插入功能是正确的。我倾向于帮助拆分令牌。

我的输出如下:

Elizabeth McCurry, George Adam, Tom Hans

但我想要这样的输出:

Germany, History, Math, Music, Science

1 个答案:

答案 0 :(得分:1)

好的,这是一个如何做到这一点的示例。我正在使用你的课程文件(我将其重命名为temp.txt),我也在Linux上使用在Ubuntu上运行的gcc版本4.8.2进行此操作。我还删除了strtok_r,因为strtok_rstrtok的线程安全版本,因为您没有使用线程,所以我认为没有理由使用reenterant版本。最后我添加了一点,但只是一点,错误检查。代码:

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

int main(int argc, char** argv)
{
  FILE*  fp = NULL;
  int    ndx = 0;
  char   lines[100][100];

  if(NULL != (fp = fopen("./temp.txt", "r")))
  {
    while(!feof(fp))
    {
      fgets(lines[ndx++], sizeof(lines), fp);
    }

    for(ndx = 0; ndx < 3; ndx++)
    {
      char*      name;
      char*      list;

      name = strtok(lines[ndx], ":");
      list = strtok(NULL, ":");

      printf("Name: %s  List: %s", name, list);
    }
  }
  else
  {
    printf("Unable to open temp.txt, error is %d\n", errno);
  }

  return 0;
}

在我的电脑上运行示例:

******@ubuntu:~/junk$ gcc -ansi -Wall -pedantic array.c -o array
******@ubuntu:~/junk$ ./array
Name: George Adam              List: Math,Science,Germany
Name: Elizabeth McCurry        List: Music,Math,History
Name: Tom Hans                 List: Science,Music
******@ubuntu:~/junk$ 

希望这应该足以让你开始。如果没有随意提出另一个问题或修改这个问题。我看到你正在使用Windows,但上面的代码应该足够通用,可以在那里编译,只是被告知你可能需要添加一个或两个包含文件。