如何将结构数组传递给C中的函数?

时间:2015-12-09 18:52:23

标签: c arrays function structure

我是一名C新学员。我对以下代码感到困惑,该代码旨在打印结构数组中的所有元素。我知道它可以直接在main()中完成,但是当我将printf(....)放入函数并调用此函数时,我无法传递结构数组。 有谁知道为什么。我很沮丧。谢谢。

我的结构包括关键字及其计数。初始化包含常量名称集及其计数编号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 个答案:

答案 0 :(得分: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 :(得分: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;
}