如何在C中使用二维指针数组来存储字符串



假设我有一个文件,它包含以下字符串:

option0 value0
option1 value1
....... ......
optionX valueX 

我正在尝试编写一个C程序来读取文件。我决定创建一个指向字符串的2D指针数组,并将所有选项存储在第一行的指针中,并将所有值存储在第二行的指针中。:

pointer[0][0] should point to option0
pointer[1][0] should point to value0
pointer[0][1] should point to option1
pointer[1][1] should point to value1

似乎程序读取文件成功,但我无法访问字符串来打印它们。下面是导致问题的代码的精简版本:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main (void) {
#define BUFF 1024
FILE *fd;
int i = 0;
char buff[BUFF];
char *options [2][20];
fd = fopen("foo.txt", "r");
while (!feof(fd)) {
if (fgets(buff, sizeof(buff), fd) != NULL) {
        (options[0][i] = malloc(sizeof (char) * 512)
        (options[1][i] = malloc(sizeof (char) * 512)
                sscanf(buff, "%s %s", options[0][i], options[1][i]);
                i++;
}
}
while (i >= 0) {
printf ("Option %i is %s its value is %s", i, *option[0][i], *option[1][i]);
i--;
}
fclose(fd);
return 0;
}

我玩了几天,但我似乎不能使它工作。我检查了各种Stackoverflow问题和其他在线资源,但即使是实验也没有帮助我弄清楚。

我想知道的是:字符串是否正确存储与malloc和sscanf?如果"不",为什么?为什么我不能用printf语句打印字符串?如何解决这个问题?

请注意,所显示的代码仅用于测试目的,所以我知道没有错误检查等。

将指针赋给printf时,将对指针进行解引用。对于%s,期望char*,而不是char

printf ("Option %i is %s its value is %s", i, *option[0][i], *option[1][i]);

应该是

printf ("Option %i is %s its value is %s", i, option[0][i], option[1][i]);

另一个问题是你必须在打印while循环之前减少i。在每次分配内存后增加它,所以最后它指向最后一个元素。将i--;移到while循环中的第一个

同时sizeof(char)总是1,所以在计算malloc()的大小时不需要它。

也请调整你的编译器的警告到更高的级别。例如,使用-Wall的gcc会说:

警告:格式'%s'期望参数类型为'char *',但参数2的类型为'int' [-Wformat=]

1) i--必须在printf之前

2)如Sami的回答,不要对printf

中的指针进行解引用
while (0 <=-- i)
    printf ("Option %i is %s its value is %s", i, option[0][i], option[1][i]);

相关内容

  • 没有找到相关文章

最新更新