2015-09-20 2 views
1

Давайте предположим, что у меня есть файл, который содержит следующие строки:Как использовать 2D-массив указателей в C для хранения строк?

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

Я пытаюсь сделать программу C, чтобы прочитать файл. Я решил создать 2D-массив указателей на строки и сохранить все параметры в pointee (s) первой строки и все значения в pointee (s) второй строки. Таким образом:

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

Не используйте 2D-массивы в C. Используйте 'arr [i * width + j]', когда они вам понадобятся. BTW, вы хотите [хеш-таблицу] (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]); 

Другой вопрос вы декрементируете i перед печатью в то время цикла. Вы увеличиваете его после каждого распределения памяти, поэтому в конце он указывает последний элемент. Переместите i--;, чтобы быть первым внутри цикла while.

Также sizeof(char) всегда 1, поэтому вам не нужно это при расчете размеров для malloc().

Просьба также настроить предупреждения вашего компилятора на более высокий уровень. Например, НКУ с -Wall будет сказать:

предупреждение: формат '% s' ожидает аргумент типа 'символ *', но аргумент 2 имеет тип 'Int' [-Wformat =]

+0

Я скорректировал инструкцию printf, как это было предложено, но я все еще получаю ошибки «Ошибка сегментации». – 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]); 
Смежные вопросы