realloc関数の使い方
前回のmalloc関数の使い方の続きみたいな感じです。
参考書にはmalloc関数とcalloc関数については載っていましたがrealloc関数については記述はありませんでした。
realloc関数はメモリの拡張や縮小ができるというみたいなのでdo~while文の中に入れています。
どこが間違っているのでしょうか。
/*
課題3-6
*/
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
int user; /* プレーヤの手 */
int comp; /* コンピュータの手 */
int win_no; /* 勝った回数 */
int lose_no; /* 負けた回数 */
int draw_no; /* 引き分けた回数 */
int *a;
int *b;
int *a1;
int *b1;
int i;
int stage = 0;
char *hd[] = {"グー", "チョキ", "パー"}; /* 手 */
/* initialize関数の宣言 */
void initialize(void);
/* jyanken関数の宣言 */
void jyanken(void);
/* count_no関数の宣言 */
void count_no(int result);
/* disp_result関数の宣言 */
void disp_result(int result);
/* confirm_retry関数の宣言 */
int confirm_retry(void);
/* rireki関数の宣言 */
void rireki(void);
/* メイン関数 */
int main(void)
{
int judge; /* 勝敗 */
int retry; /* もう一度 */
initialize(); /* 初期処理 */
a = (int *)calloc(5, sizeof(int));
b = (int *)calloc(5, sizeof(int));
do{
jyanken(); /* じゃんけん実行 */
/* コンピュータとプレーヤの手を表示 */
printf("私は%sで、あなたは%sです。\n", hd[comp], hd[user]);
judge = (user - comp + 3) % 3; /* 勝敗を判定 */
count_no(judge); /* 勝/負/引分け回数を更新 */
disp_result(judge); /* 判定結果を表示 */
retry = confirm_retry();
a1 = (int *)realloc(a, sizeof(int) * (draw_no+lose_no+win_no+1));
b1 = (int *)realloc(b, sizeof(int) * (draw_no+lose_no+win_no+1));
rireki();
}while(retry == 1);
for(i=0; i<draw_no+lose_no+win_no; i++){
printf("%d回目 ユーザ%c コンピュータ%c\n", i+1, hd[b1[i]], hd[a1[i]]);
}
printf("%d勝%d敗%d分けでした。\n", win_no, lose_no, draw_no);
free(a);
free(b);
return (0);
}
/*--- 初期処理 ---*/
/* initialize関数の定義 */
void initialize(void)
{
win_no = 0; /* 勝った回数 */
lose_no = 0; /* 負けた回数 */
draw_no = 0; /* 引き分けた回数 */
srand(time(NULL)); /* 乱数の種を初期化 */
printf("じゃんけんゲーム開始!!\n");
}
/*--- じゃんけん実行(手の読み込み/生成) ---*/
/* jyanken関数の定義 */
void jyanken(void)
{
int i;
comp = rand() % 3; /* コンピュータの手 (0~2) を乱数で生成 */
printf("\n\aじゃんけんポン …");
for(i=0; i<3; i++)
printf(" (%d)%s", i, hd[i]);
printf(":");
scanf("%d", &user); /* プレーヤの手を読み込む */
}
/*--- 勝/負/引き分回数を更新 ---*/
/* count_no関数の定義 */
void count_no(int result)
{
switch(result){
case 0: draw_no++; break;
case 1: lose_no++; break;
case 2: win_no++; break;
}
}
/*--- 判定結果を表示 ---*/
/* disp_result関数の定義 */
void disp_result(int result)
{
switch(result){
case 0: puts("引き分けです。"); break; /* 引き分け */
case 1: puts("あなたの負けです。"); break; /* 負け */
case 2: puts("あなたの勝ちです。"); break; /* 勝ち */
}
}
/*--- 再挑戦するか確認 ---*/
/* confirm_result関数の定義 */
int confirm_retry(void)
{
int x;
printf("もう一度しますか … (0)いいえ (1)はい:");
scanf("%d", &x);
return (x);
}
/*--- 履歴の表示 ---*/
/* rireki関数 */
void rireki(void)
{
a1[stage] = comp;
b1[stage] = user;
stage++;
}