Хранить токены от strtok () в двойном указателе "2d array" - PullRequest
0 голосов
/ 06 сентября 2018

Входной файл:

s0 0 3 0 10
s1 0 6 0 20
s2 0 5 0 11
s3 0 6 0 20
s4 67 2 0 25
s5 5 4 0 1
s6 0 2 0 5
s7 0 4 0 28
s8 0 3 0 20
s9 45 5 0 6
s10 103 3 0 2

Код:

char ** customers;
char *p;
customers = (char **)malloc(50 * sizeof(char *));

for (int i = 0; i < 50; i ++)
{
    customers[i] = (char *)malloc(5 * sizeof(char *));
}

int z = 0;
while ((nread = getline(&line, &len, stream)) != -1)
{
    int i = 0;
    p = strtok (line, " ");

    while (p != NULL)
    {
        customers[z][i] = *p;
        i++;
        p = strtok (NULL, " ");
    }
    z++;

}
printf("%s\n", customers[0]);

По сути, я читаю каждую строку входного txt-файла, разбивая ее на токены с помощью strtok () и сохраняю их в двойной указатель (customer), который работает как 2d-массив, но после выхода из цикла while Я не могу получить доступ к каждому отдельному токену в этом «2d массиве», я могу получить доступ ко всей его строке с помощью

printf(“%s\n”, customers[0])

outputs:
s0301

но при этом печатается только первый символ каждого токена, а не вся строка. Как я могу получить доступ к полной цепочке токенов, например, вот так

printf(“%s\n”, customers[0][0])
printf(“%s\n”, customers[0][1])
printf(“%s\n”, customers[0][2])
printf(“%s\n”, customers[0][3])
printf(“%s\n”, customers[0][5])

outputs:
s0
0
3
0
10

Любая помощь очень ценится!

1 Ответ

0 голосов
/ 06 сентября 2018

Строка сохраняется как массив символов char*. Поскольку ваш массив customers имеет тип char**, и вы хотите получить доступ к строке с помощью customers[z][i], тип customers должен быть char***. При заполнении массива из строковой строки используйте

p = strtok(line, " ");
while (p != NULL)
{
    customers[z][i] = p;
    i++;
    p = strtok (NULL, " ");
}

Проблемой будет malloc, поскольку вы не знаете точную длину каждой строки.

...