结构数组 - 删除/添加元素和打印

Dog*_*Dog 6 c arrays printf struct

对于以下代码

struct orderSlip
{
    char source[64];
    char destination[64];
    char item[64];  
    int position;
};
//global
struct orderSlip data[100];
Run Code Online (Sandbox Code Playgroud)

除了以下方法之外,还有其他方法可以打印出每个元素的数据:

printf("%s\n",data[0].source);
    printf("%s\n",data[0].destination);
    printf("%s\n",data[0].item);
    printf("%i\n\n", data[0].position);

    printf("%s\n",data[1].source);
    printf("%s\n",data[1].destination);
    printf("%s\n",data[1].item);
    printf("%i\n", data[1].position);
Run Code Online (Sandbox Code Playgroud)

等等

for(int n = 0; n< 3; n++)
{
    printf("%s\n",data[n].source);
    printf("%s\n",data[n].destination);
    printf("%s\n",data[n].item);
    printf("%i\n\n", data[n].position);
}
Run Code Online (Sandbox Code Playgroud)

要删除和添加,我是否必须创建一个动态的结构数组?如果是这样,最简单的语法是什么?像这个c ++代码的东西

int * bobby;
bobby = new int [5];
delete bobby[5];
Run Code Online (Sandbox Code Playgroud)

但在C?我猜它与malloc和free有关

Sco*_*ter 5

" 为了删除和添加,我是否必须创建一个动态的结构数组?如果是这样,那么最简单的语法是什么?像这个c ++代码 "

如果你知道你永远不会超过x数量的物品,或者至少检查以确保你没有超过你计划的最大值.然后你可以使用你的静态数组.

添加只需要您有一个变量来跟踪数组中的项目数:

void add_item(struct orderSlip *p,struct orderSlip a,int * num_items)
{
   if ( *num_items < MAX_ITEMS )
   {
      p[*num_items] = a;
      *num_items += 1;
   }
}
Run Code Online (Sandbox Code Playgroud)

从静态数组中删除将需要一个for循环,它会将其上方的项目向下移动一个并减少int,从而跟踪项目数量.

void delete_item(struct orderSlip *p,int *num_items, int item)
{
   if (*num_items > 0 && item < *num_items && item > -1)
   {
      int last_index = *num_items - 1;
      for (int i = item; i < last_index;i++)
      {
         p[i] = p[i + 1];
      }
      *num_items -= 1;
   }
}
Run Code Online (Sandbox Code Playgroud)

您可以通过将结构传递给执行工作的函数来简化结构的打印.

void print(const struct orderSlip  *p);
Run Code Online (Sandbox Code Playgroud)

要么

void print(const struct orderslip s);
Run Code Online (Sandbox Code Playgroud)

可选

void print(const struct orderslip s, FILE *fp);
Run Code Online (Sandbox Code Playgroud)

要么

void print(const struct orderslip *p, FILE *fp)
{
   fprintf(fp,"%s\n",p->source);
    ...
}
Run Code Online (Sandbox Code Playgroud)

void print_all(const struct orderSlip *p, int num_items)



//global
struct orderSlip data[MAX_ITEMS];
int num_items = 0;



int main(void)
{
...
       print_all(data,num_items);                                       
       strcpy(a.source,"source 2");
       strcpy(a.destination,"destination 20");
       strcpy(a.item,"item xyz");
       a.position = 99;
       add_item(data,a,&num_items);
       print_all(data,num_items);
       delete_item(data,&num_items,0);
       print_all(data,num_items);
Run Code Online (Sandbox Code Playgroud)