6

以下のコードの場合

struct orderSlip
{
    char source[64];
    char destination[64];
    char item[64];  
    int position;
};
//global
struct orderSlip data[100];

以下の方法以外に、各要素のデータを出力する別の方法はありますか。

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);

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

削除と追加のために、構造体の動的配列を作成する必要がありますか? もしそうなら、それを行うための最も簡単な構文は何ですか? このC++コードのようなもの

int * bobby;
bobby = new int [5];
delete bobby[5];

しかし、Cで?私はそれがmallocとfreeに関係していると推測しています

4

2 に答える 2

6

削除および追加するには、構造体の動的配列を作成する必要がありますか?その場合、それを行うための最も簡単な構文は何ですか?この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;
   }
}

静的配列から削除するには、その上にあるアイテムを1つ下に移動し、アイテムの数を追跡しながらintをデクリメントするforループが必要になります。

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;
   }
}

構造体を、作業を行う関数に渡すことで、構造体の印刷を簡素化できます。

void print(const struct orderSlip  *p);

また

void print(const struct orderslip s);

オプションで

void print(const struct orderslip s, FILE *fp);

また

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

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);
于 2012-08-22T04:39:16.533 に答える
3

1 つの方法は、配列内の各要素を割り当て、ポインターの配列を保持することです。

struct orderSlip **data;

data = calloc(100, sizeof(struct orderSlip*)); // 100 pointers to struct

( calloc は、最初からメモリがゼロであることを確認します)

新しい構造体を追加するたびに:

data[i] = calloc(1, sizeof(struct orderSlip));

そして、あなたがもう必要ないとき

free(data[i]);

realloc を使用してデータのサイズを変更することもできます。

インデックスを使用して配列にアクセスする必要がない場合は、代わりに、リンクされたリストのような別のタイプのデータ構造を真に動的であると考えることができます。

于 2012-08-22T04:54:17.687 に答える