清除struct数组中的项

时间:2013-12-02 04:46:17

标签: c arrays struct

这是我问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=2b=3的其他项目已消失。我在这做错了什么?我只想删除b==1的条目。我应该使用memset()来做吗?感谢

2 个答案:

答案 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);
 }