如何从 C 中的结构数组中初始化单个元素?
How to initialize a single element from an array of structures in C?
我正在使用一个代码来读取许多文件并将关键字的数量存储在其中。部分代码如下:
struct files
{
struct keyword
{
char keyname[10];
int count;
}key[32]; //for 32 keywords in C
}file[10];
如何将所有 10 个文件的关键字结构初始化为 {"void",0,"int",0,.....etc}
?
有没有一种方法可以通过一次初始化每个结构元素来初始化循环中的所有 10 个文件?
10 个文件可以使用如下所示的循环进行初始化。
for(i=0;i<10;i++)
{
for(j=0;j<32;j++)
{
strcpy(file[i].key[j].keyname,"key"); /* scan the value from user and input */
file[i].key[j].count = 0;
}
}
使用 gcc 4.4 编译 --
int main() {
struct keyword
{
char keyname[5];
int count;
};
struct keyword files[4] = { {"void",0},{"int",4},{"long",8},{"utyp",12} };
return 0;
}
猜测这取决于您使用的编译器。
稍微修改了@Gopi的代码,
char keywords[32][]={"void","int" ......}; //Holds all the needed keywords,fill upto last desired keyword
for(j=0;j<32;j++) //takes each file structure (10 file structure)
{
for(i=0;i<10;i++)
{
//updates the 32 keynames and its count
strcpy(file[i].key[j].keyname,keywords[j]);
file[i].key[j].count = 0;
}
}
使用标准 C,无法避免循环,例如:
for (int i = 0; i < 10; i++)
file[i] = (struct files){ { { "auto", 0 }, { "break", 0 },
{ "case", 0 }, { "char", 0 }, { "const", 0 },
{ "continue", 0 }, { "default", 0 }, { "do", 0 },
{ "double", 0 }, { "else", 0 }, { "enum", 0 },
{ "extern", 0 }, { "float", 0 }, { "for", 0 },
{ "goto", 0 }, { "if", 0 }, { "int", 0 },
{ "long", 0 }, { "register", 0 }, { "return", 0 },
{ "short", 0 }, { "signed", 0 }, { "sizeof", 0 },
{ "static", 0 }, { "struct", 0 }, { "switch", 0 },
{ "typedef", 0 }, { "union", 0 }, { "unsigned", 0 },
{ "void", 0 }, { "volatile", 0 }, { "while", 0 },
} };
这使用 C99 复合文字来初始化每一行。
GCC 有一个扩展,允许您在初始化器中完成所有操作(您必须在省略号前放置 space 以避免 'maximal munch' 规则出现问题):
struct files file[10] = { [0 ... 9] = { { { "auto", 0 }, { "break", 0 },
{ "case", 0 }, { "char", 0 }, { "const", 0 },
{ "continue", 0 }, { "default", 0 }, { "do", 0 },
{ "double", 0 }, { "else", 0 }, { "enum", 0 },
{ "extern", 0 }, { "float", 0 }, { "for", 0 },
{ "goto", 0 }, { "if", 0 }, { "int", 0 },
{ "long", 0 }, { "register", 0 }, { "return", 0 },
{ "short", 0 }, { "signed", 0 }, { "sizeof", 0 },
{ "static", 0 }, { "struct", 0 }, { "switch", 0 },
{ "typedef", 0 }, { "union", 0 }, { "unsigned", 0 },
{ "void", 0 }, { "volatile", 0 }, { "while", 0 },
} } };
我正在使用一个代码来读取许多文件并将关键字的数量存储在其中。部分代码如下:
struct files
{
struct keyword
{
char keyname[10];
int count;
}key[32]; //for 32 keywords in C
}file[10];
如何将所有 10 个文件的关键字结构初始化为 {"void",0,"int",0,.....etc}
?
有没有一种方法可以通过一次初始化每个结构元素来初始化循环中的所有 10 个文件?
10 个文件可以使用如下所示的循环进行初始化。
for(i=0;i<10;i++)
{
for(j=0;j<32;j++)
{
strcpy(file[i].key[j].keyname,"key"); /* scan the value from user and input */
file[i].key[j].count = 0;
}
}
使用 gcc 4.4 编译 --
int main() {
struct keyword
{
char keyname[5];
int count;
};
struct keyword files[4] = { {"void",0},{"int",4},{"long",8},{"utyp",12} };
return 0;
}
猜测这取决于您使用的编译器。
稍微修改了@Gopi的代码,
char keywords[32][]={"void","int" ......}; //Holds all the needed keywords,fill upto last desired keyword
for(j=0;j<32;j++) //takes each file structure (10 file structure)
{
for(i=0;i<10;i++)
{
//updates the 32 keynames and its count
strcpy(file[i].key[j].keyname,keywords[j]);
file[i].key[j].count = 0;
}
}
使用标准 C,无法避免循环,例如:
for (int i = 0; i < 10; i++)
file[i] = (struct files){ { { "auto", 0 }, { "break", 0 },
{ "case", 0 }, { "char", 0 }, { "const", 0 },
{ "continue", 0 }, { "default", 0 }, { "do", 0 },
{ "double", 0 }, { "else", 0 }, { "enum", 0 },
{ "extern", 0 }, { "float", 0 }, { "for", 0 },
{ "goto", 0 }, { "if", 0 }, { "int", 0 },
{ "long", 0 }, { "register", 0 }, { "return", 0 },
{ "short", 0 }, { "signed", 0 }, { "sizeof", 0 },
{ "static", 0 }, { "struct", 0 }, { "switch", 0 },
{ "typedef", 0 }, { "union", 0 }, { "unsigned", 0 },
{ "void", 0 }, { "volatile", 0 }, { "while", 0 },
} };
这使用 C99 复合文字来初始化每一行。
GCC 有一个扩展,允许您在初始化器中完成所有操作(您必须在省略号前放置 space 以避免 'maximal munch' 规则出现问题):
struct files file[10] = { [0 ... 9] = { { { "auto", 0 }, { "break", 0 },
{ "case", 0 }, { "char", 0 }, { "const", 0 },
{ "continue", 0 }, { "default", 0 }, { "do", 0 },
{ "double", 0 }, { "else", 0 }, { "enum", 0 },
{ "extern", 0 }, { "float", 0 }, { "for", 0 },
{ "goto", 0 }, { "if", 0 }, { "int", 0 },
{ "long", 0 }, { "register", 0 }, { "return", 0 },
{ "short", 0 }, { "signed", 0 }, { "sizeof", 0 },
{ "static", 0 }, { "struct", 0 }, { "switch", 0 },
{ "typedef", 0 }, { "union", 0 }, { "unsigned", 0 },
{ "void", 0 }, { "volatile", 0 }, { "while", 0 },
} } };