2015-12-09 147 views
-2

我是C新學員。我對這個下面的代碼感到困惑,它的目標是打印結構數組中的所有元素。我知道它可以直接在main()中完成,但是當我將printf(....)放入一個函數並調用此函數時,我無法傳遞結構數組。 有人知道爲什麼。我很不高興..謝謝如何將結構數組傳遞給C中的函數?

我的結構包括關鍵字和它的數量。初始化包含常量集的名稱和它的計數爲0。

#include <stdio.h> 
#include <stddef.h> 
#define NKEYS (sizeof keytab/ sizeof (Key)) 

void traversal(Key tab[], int n); // define the function 
struct key      // create the structure 
{ char *word; 
    int count; 
}; 
typedef struct key Key;   //define struct key as Key 
Key keytab[]={     // initiate the struct array 
    "auto",0, 
    "break",0, 
    "case",0, 
    "char",0, 
    "const",0, 
    "continue",0, 
    "default",0, 
    "void",0, 
    "while",0, 
}; 
int main() 
{ 
    traversal(keytab,NKEYS); 
    return 0; 
} 

void traversal(Key tab[], int n){ 
    int i; 
    for (i=0; i<n; i++){ 
     printf("%s\n",keytab[i].word); 
    } 
} 
+2

初始化不應該起作用。你有一個'struct'數組,所以你需要嵌套大括號。對於函數也使用原型聲明器,'#define'在最好情況下是危險的(使用類型的名稱作爲參數;不要硬編碼名稱,這是災難的原因)。 – Olaf

+3

'struct key {...}'和'typedef struct key key;'移動到頂部(之前.'void遍歷(Key tab [],int n);') – BLUEPIXY

+0

當然:「我沒有通過結構數組「不是特定的**問題描述。 – Olaf

回答

1

聲明任何結構或功能的使用它,而不是之後

#include <stdio.h> 
#include <stddef.h> 
#define NKEYS (sizeof keytab/ sizeof (Key)) 

// define struct first 
struct key      // create the structure 
{ char *word; 
    int count; 
}; 
typedef struct key Key; 

//then the functions that uses it 
void traversal(Key *tab, int n); 


Key keytab[]={ 
    "auto",0, 
    "break",0, 
    "case",0, 
    "char",0, 
    "const",0, 
    "continue",0, 
    "default",0, 
    "void",0, 
    "while",0, 
}; 

int main() 
{ 
    traversal(keytab,NKEYS); 
    return 0; 
} 

void traversal(Key* tab, int n){ 
    int i; 
    for (i=0; i<n; i++){ 
     printf("%s\n",tab[i].word); 
    } 
} 
1

traversal功能之前,你有一個說法稱爲tab,但您實際上並未使用該參數。相反,您直接使用keytab。因此,即使您傳遞了其他內容,該函數也會始終打印keytab

此外,您可以通過使用sentinel value來標記數組的末尾來避免計算/傳遞數組的大小。當結構包含指針時,值NULL可用作良好的哨兵,例如, word

#include <stdio.h> 
#include <stddef.h> 

struct key      // create the structure 
{ char *word; 
    int count; 
}; 

typedef struct key Key;   //define struct key as Key 

Key keytab[]={     // initiate the struct array 
    { "auto",0 }, 
    { "break",0 }, 
    { "case",0 }, 
    { "char",0 }, 
    { "const",0 }, 
    { "continue",0 }, 
    { "default",0 }, 
    { "void",0 }, 
    { "while",0 }, 
    { NULL,0 }    // sentinel value to mark the end of the array 
}; 

void traversal(Key tab[]){ 
    int i; 
    for (i=0; tab[i].word != NULL; i++){ 
     printf("%s\n",keytab[i].word); 
    } 
} 

int main(void) 
{ 
    traversal(keytab); 
    return 0; 
}