• ベストアンサー

構造体メンバの個数

jactaの回答

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.13

> st[4]は、st_ab[4]の間違いでした。 これもそうですし、他にも転記する際に省略されたり、転記ミスがあったりしますね。 字下げは気にしなくてもよいので、実際に使用しているものをそのままコピー&ペーストしてください。 また、 > その場合、nameのナル文字より後がどうなるかも教えてください。 これも重要な手がかりになるので、補足してください。

sikimori
質問者

補足

戦闘場面のソースを載せます。 /*--------------main.c----------------*/ #include<stdio.h> #include<stdlib.h> #include<time.h> #include<windows.h> #include "myhead.h" int flg2 = 4; int main() { status dt[5] = {{"人物A",6000,100,{0,0,0,0}},{"人物B",4000,300,{0,0,0,0}}, {"人物C",4000,250,{0,0,0,0}},{"人物D",6500,200,{0,0,0,0}},{"human",100000,9999,{0,0,0,0}}}; int i=0,j,flg=0,turn,check[4] = {0}; int n1,n2,n3; //乱数専用 int stflg = 0; //状態異常判定用 srand((unsigned)time(NULL)); n1 = (rand() % 10) + 1; //最初の一回だけ。味方or敵からの攻撃を決める printf("/*-------------戦闘開始!!-------------*/\n"); if(n1 % 2 == 0){ while(1){ //(1) for(j=0;j<4;j++) if(dt[j].hp == 0) flg2--;//死んだキャラがいたらflg2--。 printf("/*-----------味方のステータス---------*/\n"); for(j=0;j<4;j++){ printf("%-10s: HP = %5d MP = %3d 状態 :",dt[j].name,dt[j].hp,dt[j].mp); if(dt[j].st_ab[0] == 1){ printf("毒 "); stflg = 1;} if(dt[j].st_ab[1] == 1){ printf("沈黙 "); stflg = 1;} if(dt[j].st_ab[2] == 1){ printf("暗闇 "); stflg = 1;} if(dt[j].st_ab[3] == 1){ printf("混乱 "); stflg = 1;} if(stflg == 0) printf("なし"); printf("\n"); stflg = 0; } printf("%-10s: HP = %5d\n",dt[4].name,dt[4].hp); printf("/*------------------------------------*/\n"); while(i < flg2){ //(2) if(dt[4].hp == 0) break; //humanのHPが0ならbreak; //(2)抜け printf("味方の攻撃ターン\n"); while(1){ //(3) while(1){ //(4) printf("誰が攻撃しますか(1.人物A 2.人物B 3.人物C 4.人物D)--->"); scanf("%d",&turn); if(dt[turn-1].hp <= 0) printf("戦闘不能です\n"); else break; //(4)抜け } printf("\n"); if(turn < 1 || turn > 4){ goto end; }else{ while(1){ //(5) for(j=0;j<i+1;j++){ if(check[j] == turn){ printf("/*-----%sのターンは終了しています-----*/\n",dt[turn-1].name); flg = 1; break; } } if(flg == 1) break; //(5)抜け else{ check[i++] = turn; if(turn == 1){ chaA(dt); printf("/*-----------------人物Aのターン終了-----------------*/\n\n"); }else if(turn == 2){ chaB(dt); printf("/*------------------人物Bのターン終了------------------*/\n\n"); }else if(turn == 3){ chaC(dt); printf("/*-------------人物Cのターン終了-------------*/\n\n"); }else if(turn == 4){ chaD(dt);printf("/*----------------人物Dのターン終了------------------*/\n\n");} flg = 2; break; //(5)抜け } } } if(flg == 2) break; //(3)抜け flg = 0; //これがないと正常動作しない } } if(dt[4].hp == 0){ printf("humanを倒しました!!\n"); break; //(1)抜け } human(dt); //4人攻撃が終わったので、次は敵のターン if(dt[0].hp == 0 && dt[1].hp == 0 && dt[2].hp == 0 && dt[3].hp == 0){ printf("/*----------ゲームオーバーです----------*/\n"); break; //味方全員戦闘不能 //(1)抜け } for(i=0;i<4;i++) check[i] = -1; i = flg = 0; flg2 = 4; Sleep(2000); system("cls"); } ここからはelseで、n1が奇数の場合、敵からの攻撃になるため攻撃順序がhuman関数から始まり、味方のターンになるため、主なソースは同じになってます。endは、main.cの一番最後にあります。 本題ですが、nameのNULL文字以降調べようとしたのですが、調べ方が分からなくて;; 基本的に文字化けしたり、値か変わったりするのは、ダメージを受けたあとになっているようです。

関連するQ&A

  • 構造体メンバ及び、strncpy()について

    /* 構造体のメンバを char name[30]; にした時は実行できますが、char *name; としたときはプログラムを実行できません。 コンパイルエラーはともに出ないのですが、strncpy();の使い方が間違っているのか、先に構造体側でメモリサイズを確保しないと、使えないのか? メンバをポインタで持たせた構造体を初期化する関数の作り方を教えてください。 よろしくお願いします。 */ #include <stdio.h> #include <string.h> typedef struct{ char *name; int no; }ST; void set_name(ST *st, char *name, int no); int main(void) { ST st; set_name(&st, "テスト", 1); printf("%s No%d\n", st.name, st.no); return 0; } void set_name(ST *st, char *name, int no) { strncpy(st->name, name, 30); st->no=no; }

  • 構造体で・・・・

    構造体は配列を使用せずメモリ領域を獲得する関数を使用すること、 *構造体内部のメンバ名には配列を用いて良い。  という、条件があるのですが場合はどのようにすればよろしいでしょうか? どなたか教えてください。 構造体は以下のようになってます。 /*構造体の定義*/ struct seiseki{   char name[20];   int eig;   int suu;   int kok;   char rank[3]; };

  • 構造体について

    凄く初歩的な質問で申し訳ありませんが… 入門書の構造体のところで 以下のようなプログラムの例がありました。 #include <stdio.h> struct seiseki { /* 構造体の宣言 */ int no; char name[20]; double average; }; int main(void) { int i; struct seiseki seito1, seito2[20]; /* 構造体変数と構造体配列の宣言 */ >char name[20] というのは、NAMEの領域を20文字 確保すると言うことですよね? >struct seiseki seito1, seito2[20] ここの箇所が分からないのですが seito2[20]の20というのは どうして20なのですか? NAMEだけではないので もっと大きな数字になるような気がするのですが… またseito1の方は どうして数字が何もないんですか? 考え違いをしているところを ご指摘して頂ければ幸いです。

  • 異なる構造体のデータのコピー

    (1)で受け取った構造体のメンバのデータを (2)の構造体のメンバにコピーしたいと考えています。 (1) typedef struct _recvData{ int data01; int data02; char data03; char data 04; char data05; char data 06; char data07; char data08; char data09; char data10; char array01[16]; char array02[16]; } recvData; (2) typedef struct _sendData{ int header; int data01; int data02; char data03; char data 04; char data05; char data 06; char data07; char data08; char data09; char data10; int array01[4]; int array02[4]; } sendData; そこで2点ほどおしえていただきたく、お願い致します。 (1)構造体が微妙に異なるため、各メンバ変数に値をそれぞれ代入していくしか方法がないのでしょうか? (2)array01, array02はデータの型が異なる場合、データのコピーはどのようにしたらよいでしょうか?

  • 文字列配列をメンバにもつ構造体の,メモリ動的確保

    下に同様の質問があるのですが,やはり理解できません. 文字列配列をメンバにもつ構造体の,メモリを動的に確保をしたいのですが,うまくいきません. 具体的には以下のようです. 正しくはどのようにすればよいでしょうか.よろしくお願いします. typedef struct { char **boy; char **girl; } Name_class; int init_name_class(Name_class name_class, int n_boy, int n_girl) { int i; name_class.boy = (char**) malloc( n_boy * sizeof(char**) ); for(i=0; i<n_boy; i++) name_class.boy[i] = (char*) malloc( 32 * sizeof(char*) ); name_class.girl = (char**) malloc( n_girl * sizeof(char**) ); for(i=0; i<n_girl; i++) name_class.girl[i] = (char*) malloc( 32 * sizeof(char*) ); } main(int argc, char *argv[]) { int i, j, n_boy=3, n_girl=2; Name_class name_class; init_name_class(name_class, n_boy, n_girl); name_class.boy[0] = "yukio"; name_class.boy[1] = "hideaki"; name_class.boy[2] = "mitsuru"; name_class.girl[0] = "youko"; name_class.girl[1] = "chiharu"; printf("%s, %s, %s, %s, %s\n", name_class.boy[0], name_class.boy[1], name_class.boy[2], name_class.girl[0], name_class.girl[1]); }

  • C言語にて構造体のメンバがNULLであるかを判定するサンプルを作成して

    C言語にて構造体のメンバがNULLであるかを判定するサンプルを作成しています。 一応目的の動作はするのですが、プログラミングとして正しいか教えて頂ければと 思います。 <test.c> int main() { /* ---------------------------------------- */ /* 構造体のメンバ(NULL保障無し)がNULLか */ /* 比較するサンプル */ /* ---------------------------------------- */ char buf[50]; /* サンプル構造体 */ struct ST_test { int cd; char name[10]; int no; }; struct ST_test st_test; /* 構造体定義 */ memset(&st_test,0x00,sizeof(st_test)); /* 構造体初期化 */ memset(&buf[0],0x00,sizeof(buf)); /* 構造体初期化 */ /* 構造体に値セット */ st_test.cd = 12; memcpy(&st_test.name[0],"aabbccddee",sizeof(st_test.name)); st_test.no = 999; /* NULL判定 */ if(*st_test.name == 0x00) { printf("NULLです\n"); } else { printf("NULLではないです\n"); } return (0); }

  • [C] 構造体メンバーのカンマ区切り出力

    構造体メンバーのカンマ区切り出力をしたいと思っています。 たとえば struct XXX { char name[20]; char address[40]; char tel[12]; ... 100メンバーくらいある } のような構造体があったとします。 printf("%s,%s,%s\n", s_ptr->name, s_ptr->address, s_ptr->tel); などのようにメンバー名(変数名)を参照せずに、構造体のメンバーへのポインタを順次取得しループして出力するなどして、実現することは可能でしょうか?

  • 構造体のメンバへのアクセスについて

    お世話になります。 構造体testがあり そのメンバにchar a1[10],a2[20]・・・a100[20]まであるとします。 (配列サイズは不定) このときtest.an (nは任意の数値)にアクセスしたいのですが どう記述したらいいでしょうか? どなたかご指南お願いします。

  • ファイルから読みこんで構造体に格納する、

    shohinというファイルに RX-100 odango_tsumeawase 3000という のが 五行ならんでいるのですが、 これを読み込んで struct shohin{ char code[10]: char name[40]; int price; } にファイルから読みこんで構造体配列に 格納したいのですが、構造体配列に格納する やりかたがわかりません。 構造体配列は struct shohin list[];というのを宣言しています。 ファイルから一行読み込んで fprintf()を使おうと思うのですが、 それはできますか? メンバ毎に格納したいのですが、 それがわかりません お願いします。

  • C言語の文字列を含んだ構造体

    下記のサイトに構造体のことが書かれています。 http://www.isl.ne.jp/pcsp/beginC/C_Language_14.html その中の (3)構造体の初期化 の記述で  //構造体の型宣言  struct student{   int no; // 学籍番号   char name[256]; // 氏名   int year; // 学年   char student_class[256]; // クラス  }; と書かれています。 次の(4)構造体のデータ参照では、  //構造体の型宣言  struct OLD{   int no; //番号   char *name; //名前   int s_year; //年   char s_class; //クラス  }; と書かれています。 ここで質問です。 前者の名前は char name[256] ですが、 後者の名前は char *name になっています。 name[256] と *name では何が違うのでしょうか? どういうときに使い分けるのでしょうか?