这是我问here的问题的延续:
现在,我想问一下清除/清空struct数组中元素的正确方法。根据给出的解决方案,我试图使结构中的a []数组无效。例如
struct mystruct
{
char a[10];
int b;
}; // semi-colon added!
struct mystruct array[20] =
{
{ "test1", 1 }, // character strings!
{ "test2", 2 },
{ "test3", 3 },
};
int i;
for (i=0 ; array[i].a[0] != '\0' ; i++){
if ( array[i].b == 2 ){
array[i].a[0] = '\0';
break;
}
}
for (i=0 ; array[i].a[0] != '\0' ; i++){
printf("[%s] => %f\n", array[i].a, array[i].b);
}
当我显示数组时,只剩下第一个项目。 b=2
和b=3
的其他项目已消失。我在这做错了什么?我只想删除b==1
的条目。我应该使用memset()来做吗?感谢
答案 0 :(得分:2)
最后一个循环:
for (i=0 ; i < 3 ; ++i){
if(array[i].a[0] != '\0')
printf("[%s] => %f\n", array[i].a, array[i].b);
}
答案 1 :(得分:1)
此迭代条件在您的第二个循环中不正确:
for (i=0 ; array[i].a[0] != '\0' ; i++)
因为您在第一个循环中设置了array[1].a[0] == '\0'
,所以第二个循环会在看到array[1].a[0] == '\0'
时停止。
您需要通过一些不同的方式跟踪有效元素的数量,而不是测试字符串的第一个字符。例如,您可以循环遍历整个数组,只以这种方式打印出有效元素:
for (i=0 ; i < sizeof(array)/sizeof(array[0]) ; i++){
if (array[i].a[0] == 0) /* skip empty elements */
continue;
printf("[%s] => %f\n", array[i].a, array[i].b);
}