2017-05-11 10 views
1

私はこのプログラムを学校に書きましたが、終了してもdev-cppは最後にSIGSEGVエラーを返します。 Googleで検索すると、私の問題はおそらく私の構造内の文字にバインドされているすべてから来ていることがわかりました。 私は私のchar nom [10]とchar nom_team [10]をsprintfで書き込もうとしています。 デフォルトの「プレーヤー」の名前に数値を広告したいので、私はこれを行います。 プレーヤー1、プレーヤー2、...sprintfで構造体にcharを書き込むにはどうすればいいですか

私はどこに書きたいのですか?私は所有していません。 私はプレーヤー1、プレーヤー2、...のいずれかを達成するための他の方法も知らない。

ありがとうございました。

EDIT(マイケル・ワルツのコメント次の完全なコード&編集)

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
typedef struct player player; //shortened Perso type 
typedef struct team Team; //shortened Team type 

struct player //perso structure 
{ 
    char name[10]; //player name 
    int HP; //healt points 
    int ATK; //attack points 
    int DEF; //defense points 
}; 

struct team //team structure 
{ 
    char name_team[10]; //team name 
    player player[5]; //players in the team 
    int nbrP; //number of players left 
}; 

void init_player (player*); //player initialisation 
void fight (player*,player*); //damage calculation 
int HPP (player*,player*); //players duel simulation 
void init_team (Team*); //team initialisation 
char* TvT (Team*,Team*); //team combat simulation 

main() //main 
{ 
    srand(time(NULL)); 
    int i; 
    char* wint; //winning team name string 
    Team t[2]; //the 2 teams 
    for (i=1;i<3;i++) 
    { 
     init_team (&t[i]); //teams initialisation 
    } 
    //changing team names 
    sprintf(t[1].name_team,"%s","Orange"); 
    sprintf(t[2].name_team,"%s","Verte"); 
    //changing players names 
    sprintf(t[1].player[0].name,"%s","Gerald"); 
    sprintf(t[1].player[1].name,"%s","Ilda"); 
    sprintf(t[1].player[2].name,"%s","Falion"); 
    sprintf(t[1].player[3].name,"%s","Thor"); 
    sprintf(t[1].player[4].name,"%s","Ralof"); 
    sprintf(t[2].player[0].name,"%s","Gandalf"); 
    sprintf(t[2].player[1].name,"%s","Jaena"); 
    sprintf(t[2].player[2].name,"%s","Philip"); 
    sprintf(t[2].player[3].name,"%s","Astrid"); 
    sprintf(t[2].player[4].name,"%s","Ponchaut"); 
    wint = TvT (&t[1],&t[2]); //wint is the result of the combat between the two teams 
    printf("%s\n",wint); 
} 

void init_player (player* p) //player initialisation 
{ 
    static int i=1; //static variable for player number 
    sprintf(p->name,"player %d",i); //applying player name 
    p->HP = 100 + rand()%10; //giving HP 
    p->ATK = 10 + rand()%10; //giving ATK 
    p->DEF = 5 + rand()%5; //giving DEF 
    printf("name : %s\n",p->name); 
    printf("HP : %d\n",p->HP); 
    printf("ATK : %d\n",p->ATK); 
    printf("DEF : %d\n",p->DEF); 
    printf("\n"); 
    //showing player stats 
    i++; //next player number 
} 

void fight (player *p1,player *p2) //damage calculation 
{ 
    int DAM; 
    DAM = p1->ATK - p2->DEF; //simple damage calculation 
    printf("DAM : %d\n",DAM); //showing damage done 
    p2->HP = p2->HP - DAM; //applying damage 
} 

int HPP (player *p1,player *p2) //players duel simulation 
{ 
    int turnp; //turns of the duel 
    for (turnp=1;p1->HP>0 && p2->HP>0;turnp++) //continues while players are alive 
    { 
     printf("HP p1 : %d\n",p1->HP); //showing hp before combat 
     printf("HP p2 : %d\n",p2->HP); 
     if(turnp%2 != 0) fight (p1,p2); //p1 always begin 
     else fight (p2,p1); //then it's p2's turn to attack 
    } 
    if (p1->HP<=0) return 2; //p2 is the winner if p1 dies 
    else return 1; //p1 is the winner is p2 dies 
} 

void init_team (Team* t) //team initialisation 
{ 
    int i; 
    static int k=1; //static variable for team number 
    sprintf(t->name_team,"team %d",k); //applying team name 
    t->nbrP = 5; //defining number of players left in team at the start 
    for (i=0;i<5;i++) 
    { 
     init_player(&t->player[i]); //initializing players in team 
    } 
    k++; //next team number 
} 

char* TvT (Team* t1, Team* t2) //team combat simulation 
{ 
    int turnt,winp; //team combat turns and duel winner variables 
    int i=0,j=0; 
    for (turnt=1;t1->nbrP>0 && t2->nbrP>0;turnt++) //continues while the teams have at least one player left alive 
    { 
     printf("%s de la team %s contre %s de la team %s\n",t1->player[i].name,t1->name_team,t2->player[j].name,t2->name_team); 
     //introduction message to next duel 
     winp = HPP (&t1->player[i],&t2->player[j]); //simulating duel, the result is stored in winp 
     if (winp == 1) 
     { 
      (t2->nbrP)--; //if player in team 2 dies we decrement the number of players left in that team 
      j++; //we order the next player in the team 2 to duel 
     } 
     else 
     { 
      (t1->nbrP)--; ///if player in team 1 dies we decrement the number of players left in that team 
      i++; //we order the next player in the team 1 to duel 
     } 
    } 
    if(t1->nbrP<=0) return t2->name_team; //if team 1 loses we return team 2's name 
    else return t1->name_team; //if team 2 loses we return team 1's name 
} 

注:私は

char name[100] 

char name_team[100] 

を置くとき、私はこれだけ

を取得

t2の勝利が「Verteの」の下insteaに「@。■b」を書かされたときに、私が望む結果はことを除いて(これです:私はちょうどコンパイルする場合、実行のいずれかで

name : player 1 
HP : 109 
ATK : 14 
DEF : 9 

name : player 2 
HP : 106 
ATK : 12 
DEF : 8 

name : player 3 
HP : 106 
ATK : 17 
DEF : 8 

name : player 4 
HP : 100 
ATK : 11 
DEF : 8 

name : player 5 
HP : 103 
ATK : 12 
DEF : 9 

name : player 6 
HP : 106 
ATK : 12 
DEF : 6 

name : player 7 
HP : 105 
ATK : 13 
DEF : 7 

name : player 8 
HP : 107 
ATK : 19 
DEF : 7 

name : player 9 
HP : 100 
ATK : 16 
DEF : 8 

name : player 10 
HP : 105 
ATK : 11 
DEF : 9 

Gerald de la team Orange contre Gandalf de la team Verte 
HP p1 : 109 
HP p2 : 106 
DAM : 8 
HP p1 : 109 
HP p2 : 98 
DAM : 3 
HP p1 : 106 
HP p2 : 98 
DAM : 8 
HP p1 : 106 
HP p2 : 90 
DAM : 3 
HP p1 : 103 
HP p2 : 90 
DAM : 8 
HP p1 : 103 
HP p2 : 82 
DAM : 3 
HP p1 : 100 
HP p2 : 82 
DAM : 8 
HP p1 : 100 
HP p2 : 74 
DAM : 3 
HP p1 : 97 
HP p2 : 74 
DAM : 8 
HP p1 : 97 
HP p2 : 66 
DAM : 3 
HP p1 : 94 
HP p2 : 66 
DAM : 8 
HP p1 : 94 
HP p2 : 58 
DAM : 3 
HP p1 : 91 
HP p2 : 58 
DAM : 8 
HP p1 : 91 
HP p2 : 50 
DAM : 3 
HP p1 : 88 
HP p2 : 50 
DAM : 8 
HP p1 : 88 
HP p2 : 42 
DAM : 3 
HP p1 : 85 
HP p2 : 42 
DAM : 8 
HP p1 : 85 
HP p2 : 34 
DAM : 3 
HP p1 : 82 
HP p2 : 34 
DAM : 8 
HP p1 : 82 
HP p2 : 26 
DAM : 3 
HP p1 : 79 
HP p2 : 26 
DAM : 8 
HP p1 : 79 
HP p2 : 18 
DAM : 3 
HP p1 : 76 
HP p2 : 18 
DAM : 8 
HP p1 : 76 
HP p2 : 10 
DAM : 3 
HP p1 : 73 
HP p2 : 10 
DAM : 8 
HP p1 : 73 
HP p2 : 2 
DAM : 3 
HP p1 : 70 
HP p2 : 2 
DAM : 8 
Gerald de la team Orange contre Jaena de la team Verte 
HP p1 : 70 
HP p2 : 105 
DAM : 7 
HP p1 : 70 
HP p2 : 98 
DAM : 4 
HP p1 : 66 
HP p2 : 98 
DAM : 7 
HP p1 : 66 
HP p2 : 91 
DAM : 4 
HP p1 : 62 
HP p2 : 91 
DAM : 7 
HP p1 : 62 
HP p2 : 84 
DAM : 4 
HP p1 : 58 
HP p2 : 84 
DAM : 7 
HP p1 : 58 
HP p2 : 77 
DAM : 4 
HP p1 : 54 
HP p2 : 77 
DAM : 7 
HP p1 : 54 
HP p2 : 70 
DAM : 4 
HP p1 : 50 
HP p2 : 70 
DAM : 7 
HP p1 : 50 
HP p2 : 63 
DAM : 4 
HP p1 : 46 
HP p2 : 63 
DAM : 7 
HP p1 : 46 
HP p2 : 56 
DAM : 4 
HP p1 : 42 
HP p2 : 56 
DAM : 7 
HP p1 : 42 
HP p2 : 49 
DAM : 4 
HP p1 : 38 
HP p2 : 49 
DAM : 7 
HP p1 : 38 
HP p2 : 42 
DAM : 4 
HP p1 : 34 
HP p2 : 42 
DAM : 7 
HP p1 : 34 
HP p2 : 35 
DAM : 4 
HP p1 : 30 
HP p2 : 35 
DAM : 7 
HP p1 : 30 
HP p2 : 28 
DAM : 4 
HP p1 : 26 
HP p2 : 28 
DAM : 7 
HP p1 : 26 
HP p2 : 21 
DAM : 4 
HP p1 : 22 
HP p2 : 21 
DAM : 7 
HP p1 : 22 
HP p2 : 14 
DAM : 4 
HP p1 : 18 
HP p2 : 14 
DAM : 7 
HP p1 : 18 
HP p2 : 7 
DAM : 4 
HP p1 : 14 
HP p2 : 7 
DAM : 7 
Gerald de la team Orange contre Philip de la team Verte 
HP p1 : 14 
HP p2 : 107 
DAM : 7 
HP p1 : 14 
HP p2 : 100 
DAM : 10 
HP p1 : 4 
HP p2 : 100 
DAM : 7 
HP p1 : 4 
HP p2 : 93 
DAM : 10 
Ilda de la team Orange contre Philip de la team Verte 
HP p1 : 106 
HP p2 : 93 
DAM : 5 
HP p1 : 106 
HP p2 : 88 
DAM : 11 
HP p1 : 95 
HP p2 : 88 
DAM : 5 
HP p1 : 95 
HP p2 : 83 
DAM : 11 
HP p1 : 84 
HP p2 : 83 
DAM : 5 
HP p1 : 84 
HP p2 : 78 
DAM : 11 
HP p1 : 73 
HP p2 : 78 
DAM : 5 
HP p1 : 73 
HP p2 : 73 
DAM : 11 
HP p1 : 62 
HP p2 : 73 
DAM : 5 
HP p1 : 62 
HP p2 : 68 
DAM : 11 
HP p1 : 51 
HP p2 : 68 
DAM : 5 
HP p1 : 51 
HP p2 : 63 
DAM : 11 
HP p1 : 40 
HP p2 : 63 
DAM : 5 
HP p1 : 40 
HP p2 : 58 
DAM : 11 
HP p1 : 29 
HP p2 : 58 
DAM : 5 
HP p1 : 29 
HP p2 : 53 
DAM : 11 
HP p1 : 18 
HP p2 : 53 
DAM : 5 
HP p1 : 18 
HP p2 : 48 
DAM : 11 
HP p1 : 7 
HP p2 : 48 
DAM : 5 
HP p1 : 7 
HP p2 : 43 
DAM : 11 
Falion de la team Orange contre Philip de la team Verte 
HP p1 : 106 
HP p2 : 43 
DAM : 10 
HP p1 : 106 
HP p2 : 33 
DAM : 11 
HP p1 : 95 
HP p2 : 33 
DAM : 10 
HP p1 : 95 
HP p2 : 23 
DAM : 11 
HP p1 : 84 
HP p2 : 23 
DAM : 10 
HP p1 : 84 
HP p2 : 13 
DAM : 11 
HP p1 : 73 
HP p2 : 13 
DAM : 10 
HP p1 : 73 
HP p2 : 3 
DAM : 11 
HP p1 : 62 
HP p2 : 3 
DAM : 10 
Falion de la team Orange contre Astrid de la team Verte 
HP p1 : 62 
HP p2 : 100 
DAM : 9 
HP p1 : 62 
HP p2 : 91 
DAM : 8 
HP p1 : 54 
HP p2 : 91 
DAM : 9 
HP p1 : 54 
HP p2 : 82 
DAM : 8 
HP p1 : 46 
HP p2 : 82 
DAM : 9 
HP p1 : 46 
HP p2 : 73 
DAM : 8 
HP p1 : 38 
HP p2 : 73 
DAM : 9 
HP p1 : 38 
HP p2 : 64 
DAM : 8 
HP p1 : 30 
HP p2 : 64 
DAM : 9 
HP p1 : 30 
HP p2 : 55 
DAM : 8 
HP p1 : 22 
HP p2 : 55 
DAM : 9 
HP p1 : 22 
HP p2 : 46 
DAM : 8 
HP p1 : 14 
HP p2 : 46 
DAM : 9 
HP p1 : 14 
HP p2 : 37 
DAM : 8 
HP p1 : 6 
HP p2 : 37 
DAM : 9 
HP p1 : 6 
HP p2 : 28 
DAM : 8 
Thor de la team Orange contre Astrid de la team Verte 
HP p1 : 100 
HP p2 : 28 
DAM : 3 
HP p1 : 100 
HP p2 : 25 
DAM : 8 
HP p1 : 92 
HP p2 : 25 
DAM : 3 
HP p1 : 92 
HP p2 : 22 
DAM : 8 
HP p1 : 84 
HP p2 : 22 
DAM : 3 
HP p1 : 84 
HP p2 : 19 
DAM : 8 
HP p1 : 76 
HP p2 : 19 
DAM : 3 
HP p1 : 76 
HP p2 : 16 
DAM : 8 
HP p1 : 68 
HP p2 : 16 
DAM : 3 
HP p1 : 68 
HP p2 : 13 
DAM : 8 
HP p1 : 60 
HP p2 : 13 
DAM : 3 
HP p1 : 60 
HP p2 : 10 
DAM : 8 
HP p1 : 52 
HP p2 : 10 
DAM : 3 
HP p1 : 52 
HP p2 : 7 
DAM : 8 
HP p1 : 44 
HP p2 : 7 
DAM : 3 
HP p1 : 44 
HP p2 : 4 
DAM : 8 
HP p1 : 36 
HP p2 : 4 
DAM : 3 
HP p1 : 36 
HP p2 : 1 
DAM : 8 
HP p1 : 28 
HP p2 : 1 
DAM : 3 
Thor de la team Orange contre Ponchaut de la team Verte 
HP p1 : 28 
HP p2 : 105 
DAM : 2 
HP p1 : 28 
HP p2 : 103 
DAM : 3 
HP p1 : 25 
HP p2 : 103 
DAM : 2 
HP p1 : 25 
HP p2 : 101 
DAM : 3 
HP p1 : 22 
HP p2 : 101 
DAM : 2 
HP p1 : 22 
HP p2 : 99 
DAM : 3 
HP p1 : 19 
HP p2 : 99 
DAM : 2 
HP p1 : 19 
HP p2 : 97 
DAM : 3 
HP p1 : 16 
HP p2 : 97 
DAM : 2 
HP p1 : 16 
HP p2 : 95 
DAM : 3 
HP p1 : 13 
HP p2 : 95 
DAM : 2 
HP p1 : 13 
HP p2 : 93 
DAM : 3 
HP p1 : 10 
HP p2 : 93 
DAM : 2 
HP p1 : 10 
HP p2 : 91 
DAM : 3 
HP p1 : 7 
HP p2 : 91 
DAM : 2 
HP p1 : 7 
HP p2 : 89 
DAM : 3 
HP p1 : 4 
HP p2 : 89 
DAM : 2 
HP p1 : 4 
HP p2 : 87 
DAM : 3 
HP p1 : 1 
HP p2 : 87 
DAM : 2 
HP p1 : 1 
HP p2 : 85 
DAM : 3 
Ralof de la team Orange contre Ponchaut de la team Verte 
HP p1 : 103 
HP p2 : 85 
DAM : 3 
HP p1 : 103 
HP p2 : 82 
DAM : 2 
HP p1 : 101 
HP p2 : 82 
DAM : 3 
HP p1 : 101 
HP p2 : 79 
DAM : 2 
HP p1 : 99 
HP p2 : 79 
DAM : 3 
HP p1 : 99 
HP p2 : 76 
DAM : 2 
HP p1 : 97 
HP p2 : 76 
DAM : 3 
HP p1 : 97 
HP p2 : 73 
DAM : 2 
HP p1 : 95 
HP p2 : 73 
DAM : 3 
HP p1 : 95 
HP p2 : 70 
DAM : 2 
HP p1 : 93 
HP p2 : 70 
DAM : 3 
HP p1 : 93 
HP p2 : 67 
DAM : 2 
HP p1 : 91 
HP p2 : 67 
DAM : 3 
HP p1 : 91 
HP p2 : 64 
DAM : 2 
HP p1 : 89 
HP p2 : 64 
DAM : 3 
HP p1 : 89 
HP p2 : 61 
DAM : 2 
HP p1 : 87 
HP p2 : 61 
DAM : 3 
HP p1 : 87 
HP p2 : 58 
DAM : 2 
HP p1 : 85 
HP p2 : 58 
DAM : 3 
HP p1 : 85 
HP p2 : 55 
DAM : 2 
HP p1 : 83 
HP p2 : 55 
DAM : 3 
HP p1 : 83 
HP p2 : 52 
DAM : 2 
HP p1 : 81 
HP p2 : 52 
DAM : 3 
HP p1 : 81 
HP p2 : 49 
DAM : 2 
HP p1 : 79 
HP p2 : 49 
DAM : 3 
HP p1 : 79 
HP p2 : 46 
DAM : 2 
HP p1 : 77 
HP p2 : 46 
DAM : 3 
HP p1 : 77 
HP p2 : 43 
DAM : 2 
HP p1 : 75 
HP p2 : 43 
DAM : 3 
HP p1 : 75 
HP p2 : 40 
DAM : 2 
HP p1 : 73 
HP p2 : 40 
DAM : 3 
HP p1 : 73 
HP p2 : 37 
DAM : 2 
HP p1 : 71 
HP p2 : 37 
DAM : 3 
HP p1 : 71 
HP p2 : 34 
DAM : 2 
HP p1 : 69 
HP p2 : 34 
DAM : 3 
HP p1 : 69 
HP p2 : 31 
DAM : 2 
HP p1 : 67 
HP p2 : 31 
DAM : 3 
HP p1 : 67 
HP p2 : 28 
DAM : 2 
HP p1 : 65 
HP p2 : 28 
DAM : 3 
HP p1 : 65 
HP p2 : 25 
DAM : 2 
HP p1 : 63 
HP p2 : 25 
DAM : 3 
HP p1 : 63 
HP p2 : 22 
DAM : 2 
HP p1 : 61 
HP p2 : 22 
DAM : 3 
HP p1 : 61 
HP p2 : 19 
DAM : 2 
HP p1 : 59 
HP p2 : 19 
DAM : 3 
HP p1 : 59 
HP p2 : 16 
DAM : 2 
HP p1 : 57 
HP p2 : 16 
DAM : 3 
HP p1 : 57 
HP p2 : 13 
DAM : 2 
HP p1 : 55 
HP p2 : 13 
DAM : 3 
HP p1 : 55 
HP p2 : 10 
DAM : 2 
HP p1 : 53 
HP p2 : 10 
DAM : 3 
HP p1 : 53 
HP p2 : 7 
DAM : 2 
HP p1 : 51 
HP p2 : 7 
DAM : 3 
HP p1 : 51 
HP p2 : 4 
DAM : 2 
HP p1 : 49 
HP p2 : 4 
DAM : 3 
HP p1 : 49 
HP p2 : 1 
DAM : 2 
HP p1 : 47 
HP p2 : 1 
DAM : 3 
Orange 

-------------------------------- 
Process exited after 5.682 seconds with return value 3221225477 
Appuyez sur une touche pour continuer... 

dev-cppを使用しているプログラムは、すべてが完了した後にWindowsがクラッシュしたことを通知します。 debug with -g argument

私は最後にSIGSEGVエラーが発生します。

注2:snprintfをまだ学習していないので、このコマンドを使用することはできません。実際の入力はありません。 SIGSEGVエラーを返す行については、私はdev-cppにどの行があるかを尋ねる方法を知らないが、唯一の方法はコードのブロックを解説にすることである(明らかにコンパイル可能なプログラムを保持する)エラーが消え、私は、この行に私を導いたまで:

sprintf(p->name,"player %d",i); //applying player name 
+4

完全なコードを投稿してください。 – coderredoc

+1

'init_Perso'では' i'は99以上になりますか?そうであれば、あなたの 'sprintf(p-> nom ...'は 'p-> nom'に割り当てた10バイトを超えます。' init_Perso'をどこで呼び出すのかわからないと、その領域のバグ – lurker

+4

これはGDBを使って調べ、プログラムをステップするよい機会です。 – Gerhardh

答えて

0

あなたTeam配列は、2つの要素がありますが、あなたがCで1と2の配列はゼロベースされているインデックスにものを入れている - 最初の要素は[0]です

Team t[2]; 
... 
sprintf(t[0].name_team,"%s","Orange"); 
sprintf(t[1].name_team,"%s","Verte"); 
... 
// etc - change all t[1] references to t[0], and all t[2] references to t[1] 

はまた、あなたのを変更します、あなたが代わりに要素[0][1]を使用したいので、ループからfor (i=0;i<2;i++)へのループ。

インデックス[2]に書き込むと、自分に属していないメモリを上書きしてスタックを破損させます。

+0

を試してください。今は完璧に動作しています。この問題を「解決済み」とマークする方法はありますか? – Lantha

関連する問題