我已經搜索並搜索瞭解決方案,可以找到關於int,float,double,但不包含char *的多維數組的大量答案。我認爲我掌握了指針的原理,知道char,char *和char []等之間的區別,但是指向二維char指針數組的指針已經變得更好了。我試圖解析一個csv文件,並用字符串(char *)填充我的二維數組。這裏是我的代碼:使用C讀取csv文件的字符串到2D char *數組使用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.....
我知道有些是整型和浮點等,但我想他們都去爲char *然後我就可以ATOI或者什麼時候我需要使用它們。
printf只是查看我已加載測試的內容。如果我使用令牌%。* s顯示,如果使用%s,則在printf行處顯示segfaults。我認爲這意味着我在我的字符串末尾缺少空指針?
調試建議varTemp使用內存越界。此外,在第一個鍵後沒有數據的行上使用帶有%.*s
的printf時,它將在COL 1位置打印COL 0以及應該有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;'......不,我不是一個三星程序員。我也很困惑:-) – 2015-02-11 11:27:35
首先,[在C中你不應該使用'malloc'結果](http://stackoverflow.com/questions/605845/do-i-cast-the-result-的-的malloc)。要繼續,請看看分配內存的第二個循環,以及它分配的內容。然後意識到你所設置的所有'myarray [i] [j]'指針,你設置的完全一樣。 – 2015-02-11 11:28:43
哦,你不需要在循環條件中檢查'!feof(fp)',如果你在*'feof(fp)之前命中文件結束並退出循環,'fgets'將返回'NULL'返回true。 – 2015-02-11 11:30:35