2015-09-20 371 views
1

让我们假设我有一个文件,它包含以下字符串:如何在C中使用二维指针数组来存储字符串?

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

我试图做一个C程序来读取文件。 我决定创建一个指向字符串的二维数组,并将所有选项存储在第一行的指针中,并将所有值存储在第二行的指针中。通过这种方式:

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语句打印字符串?如何解决这个问题?

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

+1

不要使用'feof'来控制循环。 'while(!feof(fd))'总是错的 – ameyCU

+0

不要在C中使用二维数组。当你需要时使用'arr [i * width + j]'。顺便说一句,你想要一个[哈希表](https://en.wikipedia.org/wiki/Hash_table) –

+0

@ameyCU感谢您的建议,我会确保调整。 – zilog

回答

2

你是他们给予printf时取消引用指针。它预计char*,而不是char%s

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()时,您并不需要这样做。

请同时将编译器的警告调整到更高的级别。例如GCC与-Wall会说:

警告:格式 '%s' 的期望类型 '字符*' 的参数,但参数2具有输入 'INT'[-Wformat =]

+0

我按照建议调整了printf语句,但仍然出现“Segmentation fault”错误。 – zilog

+0

@zilog添加了另一个可能导致此崩溃的问题。 –

+0

谢谢!我还发现'while(i> = 0)'应该是'while(i> 0)'。我现在也没有收到任何警告。 – zilog

0

1 )i--有来之前printf

2)如萨米的答案,不取消引用指针在printf

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