2015-09-20 368 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]);