我想拆分一个包含文本文件信息的数组。首先,我拆分然后插入一个节点。我写了一些东西,但仍然有错误。你能帮我吗?
#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
答案 0 :(得分:1)
好的,这是一个如何做到这一点的示例。我正在使用你的课程文件(我将其重命名为temp.txt),我也在Linux上使用在Ubuntu上运行的gcc版本4.8.2进行此操作。我还删除了strtok_r
,因为strtok_r
是strtok
的线程安全版本,因为您没有使用线程,所以我认为没有理由使用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,但上面的代码应该足够通用,可以在那里编译,只是被告知你可能需要添加一个或两个包含文件。