• ベストアンサー

構造体について(配列)

こんばんはです。 下記のように 例 typedef struct person{ char name[256]; char pass[256]; }mydata; mydata men[5]; と、言う具合にあったとします。 menには全て入力されていて、例えばmen[3].nameとpassを消去したいとします。 その際、strcpy(men[3].name,"")とかしてるのですが、結局は、men[3]にはNULLが入るだけで、クリアというわけにはいかないのです。 全部クリアはmemsetをつかってできるのですが、場所指定ではどのようにするのでしょうか? 最終的にはmen[2]をクリアしたら、men[3]以降をずらして格納したいと思ってます。 切り取ったりしたいですが、できるのでしょうか?その場合、配列数は減らないのでしょうか? 消去した場所にコピーという形でずらしていったらいいかもですが・・。 アドバイスいただけたらうれしいです。 よろしくおねがいいたします。

質問者が選んだベストアンサー

  • ベストアンサー
  • Sakito0
  • ベストアンサー率100% (2/2)
回答No.3

構造体の一つを消去した時、後ろがずれるようにしたいのですね。 ただし、この場合、要素の一つを削除しても配列数が減ることはありません。一度取得した領域は、基本的に勝手に変わらないと思った方が無難です。 以下のようにすることが出来ます。要はコピーでずらしています。 ------------------------------------------- mydata mem[5]; memcpy( mem[2], mem[3], (sizeof(mydata)*2) ); // [2]を消す(ずらしてコピーする) memset( mem[4], NULL, sizeof(mydata) ); // 空いた最終領域をつぶす ------------------------------------------- 大体のOSなら、上記の方法で動作すると思います。

yuki22
質問者

お礼

お返事ありがとうございます。 専門家の方もこの方法を使用していたのです?? これからも何かとご指導ください。 回答ありがとうございました^^

すると、全ての回答が全文表示されます。

その他の回答 (2)

  • ham_kamo
  • ベストアンサー率55% (659/1197)
回答No.2

> 最終的にはmen[2]をクリアしたら、men[3]以降をずらして格納したいと思ってます。 そういうことをやりたい場合は、リスト構造を使った方がいいと思います。

参考URL:
http://www9.plala.or.jp/sgwr-t/c/sec15-5.html
yuki22
質問者

お礼

お返事ありがとうございます。 リスト構造・・・Arrayみたいなものなのでしょうか?? URLまでいただけてありがとうございます。 参考にさせていただきます^^

すると、全ての回答が全文表示されます。
  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.1

> 最終的にはmen[2]をクリアしたら、men[3]以降をずらして格納したい そのようにmem[2]を消すときの動作を分解すると ・mem[2]にmem[3]をコピー ・mem[3]にmem[4]をコピー ・mem[4]を消去(strcpy/memsetを使う方法でいいでしょう) となります。 コピー部分は開始位置/終了位置に気をつけてforで回せますね。 構造体のコピーは、=で出来るはずです。 出来なければメンバ毎にstrcpyすれば良いでしょう。

yuki22
質問者

お礼

お返事ありがとうございます。 mensetって場所指定できたのでしたか^^; まだまだ勉強不足です。 回答ありがとうございました^^

すると、全ての回答が全文表示されます。

関連するQ&A