C迭代结构数组

时间:2013-12-02 02:54:14

标签: c arrays struct

说我已经声明了一个结构

struct mystruct {
  char a[10];
  double b;
} 

struct mystruct array[20] = { 
   {'test1',1.0},
   {'test2',2.0}  <---- I just want to declare 2 items first because I am going to add new ones later.
};
int i;
for( i=0; array[i].a != NULL ;i++){ 
    ....  <--- so here I just want to display what is initialized first
} 

然而,for循环显示超过2个项目(即20个项目,但所有其余项目都是垃圾)。我只是想显示当前只有初始化的内容,即使我声明要存储20个。怎么做?感谢。

我正在使用C90标准。 另外,假设我将来添加了更多项目,但仍然少于20项,我只想显示直到“最后一项有效”。

2 个答案:

答案 0 :(得分:6)

对于将接受初始化语法(应该是任何标准C编译器)的编译器,您应该能够编写:

struct mystruct
{
  char a[10];
  double b;
};  // semi-colon added!

struct mystruct array[20] =
{ 
   { "test1", 1.0 },  // character strings!
   { "test2", 2.0 },
};
enum { ARRAY_SIZE = sizeof(array) / sizeof(array[0]) };

int i;
for (i = 0; i < ARRAY_SIZE && array[i].a[0] != '\0'; i++)
{ 
    printf("[%s] => %f\n", array[i].a, array[i].b);
}

答案 1 :(得分:1)

如果您只初始化了三个项目,通常需要记住这条信息并执行

for(i=0; i<3; i++) { ... }

如果你主动将数组的其余部分归零(例如在for循环或memset中),或者如果你将它声明为全局变量(保证编译器将其归零),你可以做类似于你想做什么:

for( i=0; array[i].a != '\0' ;i++){ ... }

由于array[i].a是一个char,你应该将它与chars进行比较。巧合的是,由于一些隐式转换(char to int),你也应该能够将它与int进行比较,所以

 for( i=0; array[i].a != 0 ;i++){ ... } 

也应该没问题。传递性地,你是NULL版本也应该工作,因为NULL只是0的宏(无论如何在大多数计算机体系结构上),但是你不应该使用它,因为(人类)约定它应该只用于空指针。