将来自strtok()的令牌存储在双指针“ 2d数组”中

时间:2018-09-06 05:31:50

标签: c pointers multidimensional-array malloc strtok

输入文件:

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()将其分解为令牌,并将其存储到功能类似于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 :(得分:0)

字符串存储为字符数组char*。由于您的数组customers的类型为char**,并且您想使用customers[z][i]访问字符串,因此customers的类型必须为char***。从行字符串填充数组时,请使用

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

一个问题将是malloc,因为您不知道每个字符串的确切长度。