C言語関係掲示板

過去ログ

No837 アドレス帳 住所録プログラム

[戻る] [ホームページ]
No.10607

アドレス帳 住所録プログラム
投稿者---チハル(2003/11/17 22:02:47)


「住所」「氏名」「電話番号」を登録し,
検索,追加,修正,削除を行えるプログラムを作りたいです。

構造体やポインタを使いたいのですが,今の私の知識では
断片的なことしかわかりません。

今作ってあるのは,

struct address
{
	char szAdd[51];//住所
	char szName[21];//氏名
	char szTel[11];//電話番号
};

struct address addData;

printf("住所:");//住所
scanf("%s",addData.szAdd);
printf("氏名:");//氏名
scanf("%s",addData.szName);
printf("電話番号:");//電話番号
scanf("%s",addData.szTel);
/*表示*/
printf("%s %s %s",addData.szAdd,addData.szName,addData.szTel);


〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

/*初期化*/
struct address
{
	char *add_pt;//住所
	char *name_pt;//氏名
	char *tel_pt;//電話番号
};

struct address addData;
addData.add_pt = "aichiken";
addData.name_pt = "chiharu";
addData.tel_pt = "053.......";


〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

struct address
{
	char szAdd[51];//住所
	char szName[21];//氏名
	char szTel[11];//電話番号
};

	struct address addData[5];

	rewind(stdin);

	scanf("%s",addData[0].szAdd);
	printf("%s",addData[0].szAdd);


〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

/*検索*/
scanf("%s",szInName);

for(i = 0 ; i < 40 ; i++)
{
	if(strcmp(addData[i].szName,szInName))
	{
		printf("該当データ");
		break;
	}
}


以上が全てで,このままではラチがあかず,完成させれません。
何とか使えるプログラムにしたいので,お願いします。



No.10612

Re:アドレス帳 住所録プログラム
投稿者---たか(2003/11/17 22:36:21)


まずリストのノードを作成するために前のノードと次のノードを指す
ポインタを追加します。今回は削除が簡単な双方向リストにしましょう。

struct address
{
  char szAdd[51];//住所
  char szName[21];//氏名
  char szTel[11];//電話番号
  struct address *prev; /* 前のリスト */
  struct address *next; /* 次のリスト */
};


No.10615

Re:アドレス帳 住所録プログラム
投稿者---たか(2003/11/17 23:12:43)


今日はちょっと時間が遅くなりましたので、まだ追加、全体表示、終了
しかできていませんが、改造するなりいろいろ試して下さい。
明日にでも時間があれば続きを作ります。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct address {
  char szAdd[51];//住所
  char szName[21];//氏名
  char szTel[11];//電話番号
  struct address *prev; /* 前のリスト */
  struct address *next; /* 次のリスト */
} Address;

Address *search(Address *);
Address *add(Address *);
Address *amend(Address *);
Address *del(Address *);
Address *printall(Address *);

Address *(*func[])(Address *) = {search, add, amend, del, printall};

int main(void)
{
  Address *ap = NULL;
  char buf[128];
  
  while (1) {
    puts("メニューを入力して下さい");
    puts("1.検索\n2.追加\n3.修正\n4.削除\n5.全体表示\n6.終了");
    gets(buf);
    if ('1' <= *buf && *buf <= '5') ap = func[*buf - '1'](ap);
    else if (*buf == '6') break;
  }

  return 0;
}

Address *search(Address *ap)
{
}

Address *add(Address *ap)
{
  Address *t = ap;
  char buf[128];
  
  while (t && t->next) t = t->next;
  if (t != NULL) {
    if ((t->next = (Address *)malloc(sizeof(Address))) == NULL) exit(1);
    t->next->prev = t;
    t = t->next;
  } else {
    if ((ap = t = (Address *)malloc(sizeof(Address))) == NULL) exit(1);
    t->prev = NULL;
  }
  t->next = NULL;

  printf("住所:");//住所
  scanf("%s", t->szAdd);
  gets(buf);
  printf("氏名:");//氏名
  scanf("%s", t->szName);
  gets(buf);
  printf("電話番号:");//電話番号
  scanf("%s", t->szTel);
  gets(buf);
  /*表示*/
  printf("%s %s %s\n", t->szAdd, t->szName, t->szTel);

  return ap;
}

Address *amend(Address *ap)
{
}

Address *del(Address *ap)
{
}

Address *printall(Address *ap)
{
  int cnt = 1;

  Address *t = ap;
  while (t) {
    printf("%d: 住所:%s 氏名:%s 電話番号:%s\n", cnt, t->szAdd, t->szName, t->szTel);
    t = t->next;
    cnt++;
  }

  return ap;
}


No.10635

Re:アドレス帳 住所録プログラム
投稿者---チハル(2003/11/18 12:55:01)


教えていただいたプログラムを試してみたのですが,
エラーが3つほど出てしまいました。
すみませんが対処法がわからないので,またお願いします。

No.10637

Re:アドレス帳 住所録プログラム
投稿者---たか(2003/11/18 14:14:45)


>教えていただいたプログラムを試してみたのですが,
>エラーが3つほど出てしまいました。
>すみませんが対処法がわからないので,またお願いします。

もちろんエラーが出ます。まだ完成してないからです。今日朝から暇を
見つつ完成したプログラムを貼り付けます。悪名高き関数gets()も使って
ますが、学習の為という事でご容赦願います。gets()を使わないよう改造
するのは貴方の勉強になるでしょう。

しかしやはりCは大変です。同じ事をC++でやろうとすると、もっと短く
スマートに書けます。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFSIZE 128

typedef struct address {
  char szAdd[51];  /* 住所 */
  char szName[21]; /* 氏名 */
  char szTel[11];  /* 電話番号*/
  struct address *prev; /* 前のリスト */
  struct address *next; /* 次のリスト */
} Address;

Address *search(Address *);
Address *add(Address *);
Address *amend(Address *);
Address *del(Address *);
Address *printall(Address *);

Address *(*func[])(Address *) = {search, add, amend, del, printall};

int main(void)
{
  Address *ap = NULL, *t;
  char dummy[BUFSIZE];
  int i;
  
  while (1) {
    puts("●メニューを入力して下さい");
    puts("1.検索\n2.追加\n3.修正\n4.削除\n5.全体表示\n6.終了");
    scanf("%d", &i); gets(dummy);
    if (1 <= i && i <= 5) ap = func[i - 1](ap);
    else if (i == 6) break;
  }

  /* リストを開放 */
  while (ap != NULL) {
    t = ap->next;
    free(ap);
    ap = t;
  }
  
  return 0;
}

Address *search(Address *ap)
{
  char buf[BUFSIZE], dummy[BUFSIZE];
  char *target[] = {"住所", "氏名", "電話番号"};
  int i, cnt = 0, count = 0;
  Address *t = ap;
  
  while (1) {
    puts("何で探しますか?\n1.住所 2.氏名 3.電話番号");
    scanf("%d", &i); gets(dummy);
    if (1 <= i && i <= 3) break;
  }
  printf("%sを入力して下さい:", target[--i]);
  gets(buf);
  
  while (t != NULL) {
    switch (i) {
    case 0: /* 住所 */
      if (!strcmp(t->szAdd, buf)) goto print;
      break;
    case 1: /* 氏名 */
      if (!strcmp(t->szName, buf)) goto print;
      break;
    case 2: /* 電話番号 */
      if (!strcmp(t->szTel, buf)) goto print;
      break;
    default: /* no condition */
      break;
    }
    t = t->next;
    cnt++;
    continue;
print:;
    printf("%d: 住所:%s 氏名:%s 電話番号:%s\n", ++cnt, t->szAdd, t->szName, t->szTel);
    t = t->next;
    count++;
  }
  printf("%d件見つかりました\n", count);
  
  return ap;
}

Address *add(Address *ap)
{
  Address *t = ap;
  
  while (t != NULL && t->next != NULL) t = t->next;
  if (t != NULL) {
    if ((t->next = (Address *)malloc(sizeof(Address))) == NULL) exit(1);
    t->next->prev = t;
    t = t->next;
  } else {
    if ((ap = t = (Address *)malloc(sizeof(Address))) == NULL) exit(1);
    t->prev = NULL;
  }
  t->next = NULL;

  printf("住所:"); /* 住所 */
  gets(t->szAdd);
  printf("氏名:"); /* 氏名 */
  gets(t->szName);
  printf("電話番号:"); /* 電話番号 */
  gets(t->szTel);
  /*表示*/
  /* printf("%s %s %s\n", t->szAdd, t->szName, t->szTel); */

  return ap;
}

Address *amend(Address *ap)
{
  Address *t = ap;
  char buf[BUFSIZE];
  int i, cnt = 0;
  
  puts("何番を修正しますか?");
  scanf("%d", &i); gets(buf);
  
  while (t != NULL) {
    if (++cnt == i) {
      puts("変更しない場合は単に[return]を押して下さい");
      printf("住所: %s -> ", t->szAdd);
      gets(buf);
      if (strlen(buf)) strcpy(t->szAdd, buf);
      printf("氏名: %s -> ", t->szName);
      gets(buf);
      if (strlen(buf)) strcpy(t->szName, buf);
      printf("電話番号: %s -> ", t->szTel);
      gets(buf);
      if (strlen(buf)) strcpy(t->szTel, buf);
      return ap;
    } else  t = t->next;
  }
  puts("番号が大きすぎます");
  return ap;
}

Address *del(Address *ap)
{
  Address *t = ap;
  char buf[BUFSIZE];
  int i, cnt = 0;

  puts("何番を削除しますか?");
  scanf("%d", &i); gets(buf);

  while (t != NULL) {
    if (++cnt == i) {
      if (t->prev != NULL) { /* 先頭ノード以外 */
        t->prev->next = t->next;
        if (t->next != NULL) t->next->prev = t->prev;
      } else { /* 先頭ノード */
        if (t->next != NULL) t->next->prev = NULL;
        ap = t->next;
      }
      free(t);
      return ap;
    }
    t = t->next;
  }
  puts("番号が大きすぎます");
  return ap;
}

Address *printall(Address *ap)
{
  int cnt = 1;

  Address *t = ap;
  while (t != NULL) {
    printf("%d: 住所:%s 氏名:%s 電話番号:%s\n", cnt++, t->szAdd, t->szName, t->szTel);
    t = t->next;
  }

  return ap;
}


No.10641

Re:アドレス帳 住所録プログラム
投稿者---たか(2003/11/18 14:35:22)


今回はリスト構造を選択しましたが、構造体の配列または構造体へのポイ
ンタの配列版でしたらもう少し簡単に書けます。

No.10643

Re:アドレス帳 住所録プログラム
投稿者---チハル(2003/11/18 20:51:59)


>今回はリスト構造を選択しましたが、構造体の配列または構造体へのポイ
>ンタの配列版でしたらもう少し簡単に書けます。

ありがとうございます。
できれば構造体の配列版のものをお願いしたいのですが。

No.10646

Re:アドレス帳 住所録プログラム
投稿者---たか(2003/11/18 22:39:12)


>ありがとうございます。
>できれば構造体の配列版のものをお願いしたいのですが。

わかりました。リスト版の物と骨組みは全く同じ、データ構造だけが
違います。

No.10647

Re:アドレス帳 住所録プログラム
投稿者---たか(2003/11/18 23:08:11)


まあこんな感じになりますかね。最大登録件数はDATASIZEです。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define BUFSIZE 128
#define DATASIZE 1000

typedef struct address {
  char szAdd[51];  /* 住所 */
  char szName[21]; /* 氏名 */
  char szTel[11];  /* 電話番号*/
} Address;

int search(Address *ap, int cnt);
int add(Address *ap, int cnt);
int amend(Address *ap, int cnt);
int del(Address *ap, int cnt);
int printall(Address *ap, int cnt);

int (*func[])(Address *, int) = {search, add, amend, del, printall};

Address ad[DATASIZE];

int main(void)
{
  char dummy[BUFSIZE];
  int i, cnt = 0;
  
  while (1) {
    puts("●メニューを入力して下さい");
    puts("1.検索\n2.追加\n3.修正\n4.削除\n5.全体表示\n6.終了");
    scanf("%d", &i); gets(dummy);
    if (1 <= i && i <= 5) cnt = func[i - 1](ad, cnt);
    else if (i == 6) break;
  }

  return 0;
}

int search(Address *ap, int cnt)
{
  char buf[BUFSIZE], dummy[BUFSIZE];
  char *target[] = {"住所", "氏名", "電話番号"};
  int i, j = 0, count = 0;
  Address *t = ap;
  
  while (1) {
    puts("何で探しますか?\n1.住所 2.氏名 3.電話番号");
    scanf("%d", &i); gets(dummy);
    if (1 <= i && i <= 3) break;
  }
  printf("%sを入力して下さい:", target[--i]);
  gets(buf);
  
  while (j++ < cnt) {
    switch (i) {
    case 0: /* 住所 */
      if (!strcmp(t->szAdd, buf)) goto print;
      break;
    case 1: /* 氏名 */
      if (!strcmp(t->szName, buf)) goto print;
      break;
    case 2: /* 電話番号 */
      if (!strcmp(t->szTel, buf)) goto print;
      break;
    default: /* no condition */
      break;
    }
    t++;
    continue;
print:;
    printf("%d: 住所:%s 氏名:%s 電話番号:%s\n", j, t->szAdd, t->szName, t->szTel);
    t++;
    count++;
  }
  printf("%d件見つかりました\n", count);
  
  return cnt;
}

int add(Address *ap, int cnt)
{
  Address *t = ap + cnt;
  
  printf("住所:"); /* 住所 */
  gets(t->szAdd);
  printf("氏名:"); /* 氏名 */
  gets(t->szName);
  printf("電話番号:"); /* 電話番号 */
  gets(t->szTel);
  /*表示*/
  /* printf("%s %s %s\n", t->szAdd, t->szName, t->szTel); */

  return cnt + 1;
}

int amend(Address *ap, int cnt)
{
  Address *t = ap;
  char buf[BUFSIZE];
  int i, j = 0;
  
  puts("何番を修正しますか?");
  scanf("%d", &i); gets(buf);
  
  while (j++ < cnt) {
    if (j == i) {
      puts("変更しない場合は単に[return]を押して下さい");
      printf("住所: %s -> ", t->szAdd);
      gets(buf);
      if (strlen(buf)) strcpy(t->szAdd, buf);
      printf("氏名: %s -> ", t->szName);
      gets(buf);
      if (strlen(buf)) strcpy(t->szName, buf);
      printf("電話番号: %s -> ", t->szTel);
      gets(buf);
      if (strlen(buf)) strcpy(t->szTel, buf);
      return cnt;
    } else t++;
  }
  puts("番号が大きすぎます");
  return cnt;
}

int del(Address *ap, int cnt)
{
  char buf[BUFSIZE];
  int i, j;

  puts("何番を削除しますか?");
  scanf("%d", &i); gets(buf);
  
  if (i > 0 && i < cnt) {
    for (j = i - 1; j < cnt - 1; j++)
      ap[j]= ap[j + 1];
    return cnt - 1;
  } else if (i == cnt) return cnt - 1;
  else {
    puts("番号が大きすぎます");
    return cnt;
  }
}

int printall(Address *ap, int cnt)
{
  int i = 0;

  while (i < cnt) {
    printf("%d: 住所:%s 氏名:%s 電話番号:%s\n", ++i, ap->szAdd, ap->szName, ap->szTel);
    ap++;
  }

  return cnt;
}


No.10648

Re:アドレス帳 住所録プログラム
投稿者---たか(2003/11/18 23:16:31)


もし個々の構造体をポインタでアクセスするのが嫌でしたら、ad[i].szAdd
のように配列式でもアクセスできます。その場合ポインタの変わりに i
が操作されます。簡単なので改造してみてください。


No.10649

Re:アドレス帳 住所録プログラム
投稿者---たか(2003/11/18 23:19:47)


ちょい関数add()を修正。ではお休みなさい。

int add(Address *ap, int cnt)
{
  Address *t = ap + cnt;
  
  if (cnt == DATASIZE) {
    puts("これ以上追加できません");
    return cnt;
  }
  printf("住所:"); /* 住所 */
  gets(t->szAdd);
  printf("氏名:"); /* 氏名 */
  gets(t->szName);
  printf("電話番号:"); /* 電話番号 */
  gets(t->szTel);
  /*表示*/
  /* printf("%s %s %s\n", t->szAdd, t->szName, t->szTel); */

  return cnt + 1;
}


No.10651

Re:アドレス帳 住所録プログラム
投稿者---チハル(2003/11/19 00:12:38)


動作確認しました。
ありがとうございます!

No.10653

Re:アドレス帳 住所録プログラム
投稿者---チハル(2003/11/19 06:13:29)


できたら
どこで何の操作をしているのかとか
細かいコメントをつけていただきたいのですが。
お願いします。

No.10655

Re:アドレス帳 住所録プログラム
投稿者---あかま(2003/11/19 09:38:24)


>できたら
>どこで何の操作をしているのかとか
>細かいコメントをつけていただきたいのですが。
>お願いします。
ヨコヤリ失礼。
できたらと書いてあるとはいえ、ちと甘えすぎなのではないかい?
プログラムを書いてもらったら

>動作確認しました。
>ありがとうございます!

よりも

ソース読ませていただきました。
ありがとうございます!

の方が書いてよかったなぁという気になります。
動かすだけなら勉強にならないからね。
その上で分からない部分があれば、

ここが分からないのですが、どういう処理をしているのですか?

と聞くのが正しい姿勢かと。
それならいくらでも答える気になります。

No.10656

Re:アドレス帳 住所録プログラム
投稿者---たか(2003/11/19 10:29:51)


>できたら
>どこで何の操作をしているのかとか
>細かいコメントをつけていただきたいのですが。
>お願いします。

まあコメントと行ってもプログラムは見たままの事をやっているだけなの
で役に立つかわかりませんが・・・・それとまだまだ無駄な所があるので
それも取り除きたい事もありますし。午前中はちょっと仕事が押していま
すので午後にでも。

No.10658

Re:アドレス帳 住所録プログラム
投稿者---たか(2003/11/19 17:38:04)


遅くなりました。こんな感じでいかがでしょうか。もしコメントで理解で
きない所があればここのHPの過去ログや解説をよく読んで何回もプログ
ラムを読み返して下さい。普通付けないようなコメントも付けてあります。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* プログラム中で多用する配列の大きさ */
#define BUFSIZE 128
#define DATASIZE 1000

/* 構造体の宣言 -- typedefを使用して以後srtuctを省略できるようにした */
typedef struct address {
  char szAdd[51];  /* 住所 */
  char szName[21]; /* 氏名 */
  char szTel[11];  /* 電話番号*/
} Address;

/* 関数のプロトタイプ宣言 -- ジャンプテーブルに入れるため引数及び返却値型はすべて同じとした */
int search(Address *ap, int cnt);
int add(Address *ap, int cnt);
int amend(Address *ap, int cnt);
int del(Address *ap, int cnt);
int printall(Address *ap, int cnt);

/* 関数のジャンプテーブル */
int (*func[])(Address *, int) = {search, add, amend, del, printall};

/* 構造体の配列 -- 大きくてスタックを消費する可能性があるので静的に定義した */
Address ad[DATASIZE];

/*
 * 処理を番号で選ばせ、所定の関数に飛ばす
 * 処理によっては配列の要素数が変化する事があるので常に要素数 cnt を返させる
 */
int main(void)
{
  char dummy[BUFSIZE];
  int i, cnt = 0;
  
  while (1) {
    puts("●メニューを入力して下さい");
    puts("1.検索\n2.追加\n3.修正\n4.削除\n5.全体表示\n6.終了");
    scanf("%d", &i); gets(dummy);
    if (1 <= i && i <= 5) cnt = func[i - 1](ad, cnt);
    else if (i == 6) break;
  }

  return 0;
}

/*
 * 格納された構造体から入力されたデータを持つものを探す
 * AND検索、OR検索などのオプションを付けたい所
 * 検索するデータをswitch文によって処理を選択
 */
int search(Address *ap, int cnt)
{
  char buf[BUFSIZE], dummy[BUFSIZE];
  char *target[] = {"住所", "氏名", "電話番号"};
  int i, j = 0, count = 0;
  Address *t = ap;
  
  while (1) {
    puts("何で探しますか?\n1.住所 2.氏名 3.電話番号");
    scanf("%d", &i); gets(dummy);
    if (1 <= i && i <= 3) break;
  }
  printf("%sを入力して下さい:", target[--i]);
  gets(buf);
  
  while (j++ < cnt) {
    switch (i) {
    case 0: /* 住所 */
      if (!strcmp(t->szAdd, buf)) goto print;
      break;
    case 1: /* 氏名 */
      if (!strcmp(t->szName, buf)) goto print;
      break;
    case 2: /* 電話番号 */
      if (!strcmp(t->szTel, buf)) goto print;
      break;
    default: /* no condition、ここには来ない */
      break;
    }
    t++;
    continue;
print:;
    printf("%d: 住所:%s 氏名:%s 電話番号:%s\n", j, t->szAdd, t->szName, t->szTel);
    t++;
    count++;
  }
  printf("%d件見つかりました\n", count);
  
  return cnt;
}
/*
 * 構造体の*最後*の次に新しいデータを付け加える
 * もし既に構造体の配列が一杯になっていたら警告を発して戻る
 * 追加に成功したら構造体の要素数が 1 増えるので cnt + 1 を返す
 */
int add(Address *ap, int cnt)
{
  Address *t = ap + cnt; /* 配列の最後の次のアドレスの計算 -- Cは配列の最後の要素の次のアドレスを指してもよい */
  
  if (cnt == DATASIZE) {
    puts("これ以上追加できません");
    return cnt;
  }
  printf("住所:"); /* 住所 */
  gets(t->szAdd);
  printf("氏名:"); /* 氏名 */
  gets(t->szName);
  printf("電話番号:"); /* 電話番号 */
  gets(t->szTel);
  /*表示*/
  /* printf("%s %s %s\n", t->szAdd, t->szName, t->szTel); */

  return cnt + 1;
}

/*
 * 任意の構造体の内容を修正する
 * 修正しない要素はreturnで飛ばせるようにした
 */
int amend(Address *ap, int cnt)
{
  Address *t;
  char buf[BUFSIZE];
  int i;
  
  puts("何番を修正しますか?");
  scanf("%d", &i); gets(buf);
  
  if (i > 0 && i <= cnt) {
    t = ap + i - 1; /* 配列のアドレスの計算 */
    puts("変更しない場合は単に[return]を押して下さい");
    printf("住所: %s -> ", t->szAdd);
    gets(buf);
    if (strlen(buf)) strcpy(t->szAdd, buf);
    printf("氏名: %s -> ", t->szName);
    gets(buf);
    if (strlen(buf)) strcpy(t->szName, buf);
    printf("電話番号: %s -> ", t->szTel);
    gets(buf);
    if (strlen(buf)) strcpy(t->szTel, buf);
  } else 
    puts("番号が不適切です");
  return cnt;
}
/*
 * 任意の構造体を削除する
 * 削除方法はそれより後ろの構造体を一つ前にずらし cnt - 1 を返す
 * i == cnt の時は実際には cnt - 1 を返すだけである
 */
int del(Address *ap, int cnt)
{
  char buf[BUFSIZE];
  int i, j;

  puts("何番を削除しますか?");
  scanf("%d", &i); gets(buf);
  
  if (i > 0 && i <= cnt) {
    for (j = i - 1; j < cnt - 1; j++)
      ap[j]= ap[j + 1];
    return cnt - 1;
  }

  puts("番号が不適切です");
  return cnt;
}

/*
 * 格納された構造体を全部表示する
 * 構造体には番号が付いてないので、カウンタ i で内部的に処理する(構造体の添え字 + 1)
 */
int printall(Address *ap, int cnt)
{
  int i = 0;

  while (i < cnt) {
    printf("%d: 住所:%s 氏名:%s 電話番号:%s\n", ++i, ap->szAdd, ap->szName, ap->szTel);
    ap++; /* 配列へのポインタが次の配列要素を指すようにする */
  }

  return cnt;
}


No.10665

Re:アドレス帳 住所録プログラム
投稿者---チハル(2003/11/19 19:12:33)


 詳しいご説明ありがとうございました。
 
 動かしてみたのですが,「住所」で「検索」した再,
検索された個人情報の「電話番号」の後に次に登録されている人の
「住所」が表示されてしまいました。

 printfのあたりをいじってみたのですが,「名前」と「電話」で
「検索」する場合は正常に動くので,修正の仕方がわかりません。

 度々すみませんが,よろしくお願いします。



No.10667

Re:アドレス帳 住所録プログラム
投稿者---たか(2003/11/19 19:22:52)


> 動かしてみたのですが,「住所」で「検索」した再,
>検索された個人情報の「電話番号」の後に次に登録されている人の
>「住所」が表示されてしまいました。
>
> printfのあたりをいじってみたのですが,「名前」と「電話」で
>「検索」する場合は正常に動くので,修正の仕方がわかりません。

構造体の宣言は次のようになっています。配列版にした途端そのような
症状が起きるという事は、電話番号に11文字以上入力されたので、'\0'
が次の住所の入力で消されてしまい、電話番号と次の住所がつながって
しまった事が考えられます。

szTel[]の大きさを11ではなく20ほどにして試してみてください。

typedef struct address {
  char szAdd[51];  /* 住所 */
  char szName[21]; /* 氏名 */
  char szTel[11];  /* 電話番号*/
} Address;


No.10682

Re:アドレス帳 住所録プログラム
投稿者---チハル(2003/11/19 20:28:19)


何度もありがとうございました。
後は自分で他の機能も作れるように努力します。