假设我有一个文件,它包含以下字符串:
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]);