みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

C言語の構造体で悩んでます。

構造体で顧客情報を管理する課題に取り組んでいるんですが、言語は苦手な分野で解決しかねてます。みなさんの力を借りたいです。お願いします。
課題は、構造体で顧客情報を確保(顧客情報入力の前に、キーボードで1~50の顧客情報の数を入力し、その数の構造体を確保)し、その後、顧客情報を登録するというものです。
私が記述したのは下記のとおりです。
間違いだらけだと思います。すみません。

#define size_id (5)
#define size_name (25)
#define size_huri (25)
#define size_tel (17)

struct kokyaku
{
long *id;
char *name;
char *huri;
char *tel;
};
int main()
{
int a , i; // 構造体確保の数、構造体参照時使用
long c = 1; // id
struct kokyaku *ko;
printf("顧客情報がありません。何件分確保しますか?(1 - 50)");
scanf("%d",&a);
ko = (struct kokyaku *)malloc( sizeof(struct kokyaku) * (a));
if(a >= 1 || a <= 50)
{
for(i = 0;i < a;i++){
  ko[i].id = (long*)malloc(size_id);
  ko[i].name = (char*)malloc(size_name);
  ko[i].huri = (char*)malloc(size_huri);
  ko[i].tel = (char*)malloc(size_tel);
      }
}else{
printf("<<入力範囲にありません>>\n");
printf("<<処理を中断します>>\n");
return 0;
}

while(c <= a)
{
 i = 0;
 printf("***** 顧客登録画面 *****\n");
 ko[i].id = &c;
 printf("氏名  :");
 scanf("%s", ko[i].name);
 printf("ふりがな:");
 scanf("%s", ko[i].huri);
 printf("電話番号:");
 scanf("%s", ko[i].tel);
 c++;
 i++;
}
}
エラーとか特にないのですが、構造体を件数分確保できていないと思います。
この後にも削除やファイル出力といった展開をさせなければならないのですが、後はなんとか自力でがんばろうと思います。

乱文ですみません。
よろしくお願いします。

投稿日時 - 2008-02-16 03:19:40

QNo.3780047

困ってます

このQ&Aは役に立ちましたか?

2人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

まずは、構造体のメンバを動的に確保する意味はなさそうなので、

struct kokyaku {
  long id;
  char name[NAME_SIZE];
  char huri[HURI_SIZE];
  char tel[TEL_SIZE];
};

にして書き直しましょう。

投稿日時 - 2008-02-16 07:03:28

ANo.1

#define size_id (5)
どうしてidのサイズを5にしようと思ったのでしょうか?
long型のサイズは5ではありません(sizeof(long)で取得できます)。

long c = 1; // id
(snip)
while(c <= a)
どうしてcという変数を使用しようと思ったのでしょうか?
iという変数を宣言しているのですから再利用してもいいのでは?
あと、whileループでcが1から始まるのはなぜ?
#構造体の確保をしているところは0からループしているのに。
forを使わないのはなぜ?

ko[i].id = &c;
これでは、cという自動変数のポインタを代入しています。
(ko[i].id = (long*)malloc(size_id);
 で確保したメモリがどっかへいってしまいます)
mallocで確保したメモリに値を入れたいのであれば、
*(ko[i].id) = c;
かな。

i = 0;
whileループ内でiを毎回0に初期化しているので
何度値を入力しても構造体配列の先頭(0番)にしか保存されません。

あと、mallocしたメモリをfreeしていない。

他にもあるかもしれませんが、とりあえず気づいた点だけ。

投稿日時 - 2008-02-16 05:08:18

お礼

回答ありがとうございます。お礼遅くなってすみません。

while内のミスを直したら構造体のそれぞれに情報を入れれるようになりました。

cをiではなく、また1からはじめている理由は、理由にはならないんですが、idは0からでなく1からはじまるからです。入れるときにi + 1でいれてもいいかなとは思ったんですが、なんとなくつくってみたって感じです^^;

*(ko[i].id) = c;と記述したらlong*とlongで異なっていますと出たのですが、どぉすればいいのでしょうか。。質問ばかりで恐縮です。。

for文を使っていないのは、この質問をするにあたってはwhileでもforでもよかったんですが、課題ではまだ続きがあって続けるためにはforよりwhileのほうが適切かなと思いwhileで記述しました。説明不足ですみません。。
ちなみに続きでは顧客情報確保後、分岐点(登録、一覧表示、削除、ファイル出力、終了)に行き、登録に行っても一件入力後分岐点に戻ってきます。だからforではなくwhile(他にも良い方法はあると思いますが…)を選びました。

長文、乱文申し訳ないです。

投稿日時 - 2008-02-18 02:26:23

あなたにオススメの質問