Я искал и искал решение этого вопроса, могу найти множество ответов о многомерных массивах int, float, double, но no char *. Я думаю, что я понимаю принципы указателей, знаю разницу между char, char * и char [] и т. Д., Но указатель на 2D-массив указателей на символы стал лучше меня. Я пытаюсь разобрать файл csv и заполнить свой 2D-массив строками (char *). Вот мой код:Прочитайте файл csv строк в 2D char * array, используя C
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define COLS 10
#define ROWS 1000
int main (void) {
char***myarray;
FILE *fp;
char charTemp[100];
char *varTemp = NULL;
char *strTemp = NULL;
int i, j;
// allocate memory to hold array ROWS
if ((myarray = (char***) malloc(ROWS * sizeof(char**))) == NULL)
return -1;
// then allocate memory to hold array COLS
for (i = 0; i < ROWS; i++)
{
if ((myarray[i] = (char**) malloc(COLS * sizeof(char**))) == NULL)
return -2;
}
// read file
if ((fp = fopen ("myfile.csv", "r")) == NULL)
return -3;
// parse and fill 'myarray'
i = 0;
j = 0;
while (!feof(fp) && fgets(charTemp, sizeof charTemp, fp)) {
strTemp = strtok(charTemp, ",");
while (strTemp != NULL) {
sscanf(strTemp, "%s", &varTemp);
myarray[i][j] = varTemp;
printf("%s ", myarray[i][j]);
j++;
if (j > COLS - 1)
j = 0;
strTemp = strtok(NULL, ",");
}
printf("\n");
i++;
}
return 0;
}
myfile.csv выглядит примерно так:
ABCD,1,0.2,0.5,0,A123,ZZ,1,120,1
BCDE,1.038,0,0.525,0,B321,YY,1.25,100,0.7
CDEF,1,0.2,0.5,0,C3P0,XX,1,120,1
DEFG,,,,,,,,,
EFGH,1,0.3,0.8,0,R2D2,WW,1.25,120,1
FGHI,,,,,,,,,
etc.....
Я знаю, некоторые из них Интс и плавает т.д., но я хочу, чтобы они все идти как полукокса *, то я могу atoi или что-то еще, когда мне нужно их использовать.
Печать предназначена только для просмотра того, что я загрузил для тестирования. Если я использую токен%. * S, он отображает, если я использую% s, он segfaults на линии printf. Я предполагаю, что это означает, что я пропускаю нулевые указатели в конце моих строк?
Отладка предполагает, что varTemp использует память за пределами границ. Кроме того, при использовании printf с %.*s
в строках без данных после первого ключа он печатает COL 0 в позиции COL 1, где должен быть указатель NULL
. то есть:
ABCD 1 0.2 0.5 0 A123 ZZ 1 120 1
BCDE 1.038 0 0.525 0 B321 YY 1.25 100 0.7
CDEF 1 0.2 0.5 0 C3P0 XX 1 120 1
DEFG DEFG
EFGH 1 0.3 0.8 0 R2D2 WW 1.25 120 1
FGHI FGHI
etc.....
Я смущен, любые идеи ?!
'char *** myarray;' ... нет, я не трехзвездный программист. Я также смущен :-) –
Для начала, [в C вы не должны накладывать результат 'malloc'] (http://stackoverflow.com/questions/605845/do-i-cast-the-result- из-таНоса). Чтобы продолжить, взгляните на второй цикл, выделяющий память, и * что * он выделяет. Тогда поймите, что все указатели 'myarray [i] [j]', которые вы устанавливаете, устанавливаются одинаково. –
О, и вам не нужно '! Feof (fp)' проверить условие цикла, 'fgets' вернет' NULL', если вы нажмете конец файла и выйдете из цикла * перед * 'feof (fp)' возвращает true. –