2016-12-11 44 views
0

我想將文件的每一行存儲在一個二維數組中,並且指向每行的anthor數組(所以我可以識別每一行),我需要將這個指針數組傳遞給一個函數所以我可以操縱我的臺詞,我闖到大知道該怎麼做傳遞指向C函數的動態數組

我有這樣的代碼讀取和存儲在陣列

char ligne[MAX]; 
//open end test the file 
FILE* fichier = fopen("csp.txt","r"); 
if(fichier == NULL){ 
    printf("can't open the file \n"); 
    return EXIT_FAILURE; 
} 
//the first line in the file contain number of other lines 
fgets(ligne, sizeof(ligne), fichier); 
int nbrTaille = strtol(ligne, NULL, 10); 

//array of pointers 
char (*tab)[nbrTaille] = malloc(nbrTaille * sizeof(ligne)); 
int i = 0; 

//tab array point each line 
while(fgets(ligne, sizeof(ligne), fichier)){ 

    if(ligne == NULL) EXIT_FAILURE; 

    strncpy(tab[i], ligne, strlen(ligne)); 
    printf("line%d : %s\n", i, tab[i]); 
    i++; 
} 
//call the funnction by passing array of pointers and the number of lines 
allDiff(tab, nbrTaille); 

我閱讀該文件是

2 
1 2 
2 3 

收到t他通過函數數組我試過,但它不工作

void allDiff(char** T, int taille) 
+0

您的評論//指針數組不準確。這不會聲明一個指針數組;它聲明瞭一個指向數組的指針。它們是有區別的。該decl應該是char(* tab)[MAX] = ...'。如果你想爲每個字符串*進行動態分配,那麼所有這些都需要改變。和不相關的,'if(ligne == NULL)EXIT_FAILURE'是毫無價值的。 'ligne'是一個自動數組,因此*從不*爲'NULL'。 – WhozCraig

+0

我可以有這種類型的數組(例如:[1] [1,2],[2] [2,3])沒有動態分配(以便每行「我」包含列「j」我的文件行[我] [j])?? – devhicham

回答

1

我總是與括號和星號混淆。更簡單的方法是聲明一個雙指針:

char ** tab; 

//you need to take care of errors. I am not doing it for simplicity 
//tab = {pointer1, pointer2, pointer3, ...., pointerN} total memory needed N * sizeof(pointer) 
tab = malloc(lines* sizeof(tab)); //how many pointers you want 
for(i = 0; i < lines; i++){ 
    tab[i] = malloc(MAX); //each string 
} 

在端釋放內存:

for(i = 0; i < lines; i++){ 
    free(tab[i]); 
} 
free(tab); 

EDIT完整代碼

char ligne[MAX]; 
//open end test the file 
FILE* fichier = fopen("csp.txt","r"); 
if(fichier == NULL){ 
    printf("can't open the file \n"); 
    return EXIT_FAILURE; 
} 
//the first line in the file contain number of other lines 
fgets(ligne, sizeof(ligne), fichier); 
int nbrTaille = strtol(ligne, NULL, 10); 

//array of pointers 
//char (*tab)[nbrTaille] = malloc(nbrTaille * sizeof(ligne)); 
int i = 0; 
char **tab; 

tab = malloc(nbrTaille * sizeof(tab)); //how many pointers you want 
for(i = 0; i < nbrTaille; i++){ 
    //sizeof(ligne) is equal to MAX 
    tab[i] = malloc(MAX); //each string 
} 

i = 0; 

//tab array point each line 
while(fgets(ligne, sizeof(ligne), fichier)){ 

    if(ligne == NULL) EXIT_FAILURE; 

    strncpy(tab[i], ligne, strlen(ligne)); 
    printf("line%d : %s\n", i, tab[i]); 
    i++; 
} 
//call the funnction by passing array of pointers and the number of lines 
allDiff(tab, nbrTaille); 
+0

'sizeof(int)'是錯誤的,並且會在任何'int'和'char *'不是相同大小的平臺上調用UB。改用'sizeof * tab'。 – WhozCraig

+0

@WhozCraig是的。我忘了指針大小與int不同。 –

+0

我正在通過讀取線條文件填充我的表格,我無法填充它,因爲它不是sizeof(int),但sizeof(line) – devhicham

1

void function(char tab[][MAXLEN], ...); 這樣做。

+0

我不能導致代碼裏面的長度被計算,怎麼傳遞它? – devhicham

+1

儘管此代碼片段可能會解決問題,但[包括解釋](http://meta.stackexchange.com/questions/114762/explaining-entirely-code-based-answers)確實有助於提高帖子的質量。請記住,您將來會爲讀者回答問題,而這些人可能不知道您的代碼建議的原因。 – DimaSan

0

對於readbility起見和理智,在創建數組或指向它們的雙指針之前,typedef C函數指針。

/* typedef the function pointer. An ftabptr points to a void function that 
    takes a char * */ 
typedef void (*ftabptr)(char *p); 


/* create an uninitalised list of twenty of them */ 
int N = 20; 
ftabptr *pointerlist = malloc(N * sizeof(ftabptr)); 

但我不認爲你真的想這樣做。你可以寫一個 函數程序,它可以用函數 指針的表進行奇怪的事情,但是如果你想玩那個遊戲(類似Lisp的語言等),通常你使用C以外的語言。高級 語言通常會發出C作爲中間步驟。