说我已经声明了一个结构
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项,我只想显示直到“最后一项有效”。
答案 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的宏(无论如何在大多数计算机体系结构上),但是你不应该使用它,因为(人类)约定它应该只用于空指针。