我有一个包含电视节目的文本文件。第一列是频道的名称,第二列是频道的开始时间,第三列是标题。我想用while循环分解文本文件,但是当我在循环外检查时,数组中的所有数据都被最后一个覆盖。请有人帮我:(
int i = 0;
FILE *f;
f = fopen("tvmusor.txt", "r");
if (!f)
{
printf("error", f);
getchar();
return -1;
}
char *buf = (char *)malloc(100);
char **chan = (char **)malloc(sizeof(char *) * 300);
char **time = (char **)malloc(sizeof(char *) * 300);
char **prog = (char **)malloc(sizeof(char *) * 300);
for (i = 0; i < 300; i++)
{
chan[i] = (char *)malloc(sizeof(char) * 30);
time[i] = (char *)malloc(sizeof(char) * 30);
prog[i] = (char *)malloc(sizeof(char) * 30);
}
i = 0;
while (!feof(f))
{
memset(buf, 0, 100);
if (fgets(buf, 100, f) == NULL)
continue;
if (strlen(buf) > 0 && strchr(buf, '\t') != NULL)
{
chan[i] = strtok(buf, "\t");
time[i] = strtok(0, "\t");
prog[i] = strtok(0, "\n");
printf("%s\t%s\t%s\n", chan[i], time[i], prog[i]);
}
i++;
}
答案 0 :(得分:0)
您要分配指针而不是复制内容。
strtok
返回指向在buf
中找到的令牌位置的指针。
因此,chan[i]
,time[i]
和prog[i]
指针将在您退出循环时指向buf
的最新内容。
当您用memory
覆盖chan[i]
,time[i]
和prog[i]
时,还有strok
泄漏。
因此更改此
chan[i] = strtok(buf, "\t");
time[i] = strtok(0, "\t");
prog[i] = strtok(0, "\n");
到
strncpy(chan[i], strtok(buf, "\t"), 30);
strncpy(time[i], strtok(0, "\t"), 30);
strncpy(prog[i], strtok(0, "\n"), 30);
警告:来自strncpy,如果src的前n个字节中没有空字节,则 放在dest中的字符串不会以空值结尾。