数组的get被while循环覆盖,它们都具有相同的数据

时间:2018-12-01 14:07:40

标签: c arrays loops

我有一个包含电视节目的文本文件。第一列是频道的名称,第二列是频道的开始时间,第三列是标题。我想用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++;
}

1 个答案:

答案 0 :(得分:0)

您要分配指针而不是复制内容。

  1. strtok返回指向在buf中找到的令牌位置的指针。

    因此,chan[i]time[i]prog[i]指针将在您退出循环时指向buf的最新内容。

  2. 当您用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中的字符串不会以空值结尾。