【问题标题】:Store tokens from strtok() in double pointer "2d array"将来自 strtok() 的标记存储在双指针“二维数组”中
【发布时间】:2019-02-11 07:21:04
【问题描述】:

输入文件:

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() 将其分解为标记,并将它们存储到一个双指针(客​​户)中,其功能类似于二维数组,但在 while 循环退出后,我无法访问这个“二维数组”中的每个单独的令牌,我可以使用

访问它的整行
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

非常感谢任何帮助!

【问题讨论】:

  • 现在您只存储第一个字符。 *p 是令牌的第一个字符,customers[z][i] 是一个字符的存储空间。
  • 如果您想要一组客户记录,请从定义 srruct customer 开始。一份客户记录应包含哪些内容?
  • @n.m.来自 Java 和 C++ 背景,过去只使用向量,所以我在这里尝试用 C 做同样的事情。切换使用 struct 解决了我的问题,所以干杯!

标签: c pointers multidimensional-array malloc strtok


【解决方案1】:

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

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

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

【讨论】:

  • 抱歉发错了
  • 尝试更改为 char *** 客户,但 printf("%s\n", customers[0][0]);在while循环之外什么都不打印
  • 在循环中打印客户会发生什么?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-25
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 2020-02-28
相关资源
最近更新 更多