Массив get перезаписывается циклом while, все они имеют одинаковые данные - PullRequest
0 голосов
/ 01 декабря 2018

У меня есть текстовый файл, который содержит телевизионные программы.Первый столбец - это название канала, второй - время его запуска, а третий - заголовок.Я хочу разбить свой текстовый файл с помощью цикла 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 голосов
/ 01 декабря 2018

Вы назначаете указатель вместо копирования содержимого.

  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 Если среди первых n байтов src нет нулевого байта, строка, помещенная в dest, не будет заканчиваться нулем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...