C迭代结构数组

说我已经声明了一个结构

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项,我只想显示直到“最后一项有效”。

对于将接受初始化语法(应该是任何标准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); } 

如果您只初始化了三个项目,那么您通常必须记住这条信息

 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的宏(无论如何在大多数计算机架构上),但是你不应该使用它,因为(人类)约定它应该只用于空指针。