質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

Q&A

解決済

2回答

1317閲覧

TCPでのセグメンテーションエラー 配列(?)

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

コンパイルエラー

コンパイルのフェーズで生成されるエラーです。よく無効なシンタックスやタイプが含まれているとき発生します。

0グッド

0クリップ

投稿2020/11/06 04:30

TCPを使ってブラックジャックでの対戦ゲームを作っているのですが
サーバー側とクライアント側を作っているのですが、

こちらはクライアントの質問になります。

エラー文が
int new[128];
↑この部分がエラー原因だと思うのですが

この配列の中を1000にすると
Bus error: 10

とエラーが出て

128にすると
Segmentation fault: 11
とでます。
書き込んでいけないところに書き込んでいると言うことはわかっていますが、
どこがいけないのかがわかりません。
よければ教えてくださると嬉しいです。

printf("ヒット: 0 スタンド: 1 ----->");
ここの選択をするとエラーが発生します。

C

1#include <stdio.h> 2#include <string.h> 3#include <unistd.h> 4#include <sys/types.h> 5#include <sys/socket.h> 6#include <netinet/in.h> 7#include <arpa/inet.h> 8#include <errno.h> 9#include <stdlib.h> 10#include <netdb.h> 11#include <fcntl.h> 12#include <pthread.h> 13 14 15 16int main(int argc,char *argv[]){ 17 18 struct sockaddr_in server; 19 int sock,i,j; 20 char buf[128]; 21 // char buf3[128]; 22 char bufdh[128]; 23 int bufd; 24 int n,ret,fd,n2; 25 int connect0,write0; 26 int new[128]; 27 /* */ 28 29 printf("あなたはプレイヤーです\n"); 30 printf("*******************\n"); 31 printf("ブラックの説明を行います。\n"); 32 printf("ブラックジャックとはトランプの山札からカードを引いて足して、ディーラーより21に近づけた方が勝ちとなります。\n"); 33 printf("しかし21をオーバーするとバーストとなり負けになります。\n"); 34 printf("ブラックジャックは11,12,13の数字は10扱いされるので今回のゲームはA~10とします。\n"); 35 printf("Aが出た場合には1 OR 10 かを選ぶことができます。\n"); 36 printf("初期の手札自動で2つ配布されます。\n"); 37 printf("\n"); 38 printf("スタンド : 最初に配られた二枚のカードのみで勝負する事。\n"); 39 printf("ヒット : 優位なハンドを得られるまでカード引き続ける事\n"); 40 printf("バースト : 手札の合計が21を超えてしまうこと\n\n\n"); 41 42 printf("開始するには 0 を押してください\n"); 43 scanf("%d",&i); 44 printf("それでは開始します。\n"); 45 printf("*******************\n"); 46 printf("あなたはプレイヤーです\n"); 47 printf("*******************\n"); 48 49 50 int s,r,t,hit,all; 51 char *hit2; 52 s=rand()%10+1; 53 r=rand()%10+1; 54 printf("***あなたの手札は %d %d です***\n\n",s,r ); 55 if(s==1){ 56 printf("あなたの手札にAがあるので1か10を選択してください\n" ); 57 printf("1 OR 10 ----->"); 58 scanf("%d",&t); 59 s=t; 60 printf("***あなたの手札は %d %d です***\n",s,r ); 61 } 62 if(r==1){ 63 printf("あなたの手札にAがあるので1か10を選択してください\n" ); 64 printf("1 OR 10 ----->"); 65 scanf("%d",&t); 66 r=t; 67 printf("***あなたの手札は %d %d です***\n",s,r ); 68 69 } 70 all=s+r; 71 72 73 74 75 76 77 78 79 80 char *hostname =argv[1]; /* ホスト名の設定 */ 81 82 struct addrinfo hints, *res; 83 struct in_addr addr; 84 int err; 85 86 memset(&hints, 0, sizeof(hints)); 87 88 hints.ai_socktype = SOCK_STREAM; 89 hints.ai_family = AF_INET; 90 91 if ((err = getaddrinfo(hostname, NULL, &hints, &res)) != 0) { 92 printf("error %d\n", err); 93 return 1; 94 95 } 96 97 addr.s_addr = ((struct sockaddr_in *)(res->ai_addr))->sin_addr.s_addr; 98 inet_ntop(AF_INET, &addr, buf, sizeof(buf)); 99 printf("ip address : %s\n", buf); 100 freeaddrinfo(res); 101 102 103 sock = socket(AF_INET,SOCK_STREAM,0); 104 105 if (sock < 0) { 106 perror("socket"); 107 printf("%d\n", errno); 108 return 1; 109 } 110 111 server.sin_family = AF_INET; 112 server.sin_port = htons(12345); 113 /* 127.0.0.1 localhost */ 114 inet_pton(AF_INET, buf, &server.sin_addr.s_addr); 115 /* */ 116 connect0= connect(sock, (struct sockaddr *)&server, sizeof(server)); 117 118 119 if (connect0 < 0) { 120 121 perror("connect"); 122 printf("%d\n", errno); 123 return 1; 124 } 125 126 memset(buf, 0, sizeof(buf)); 127 128 129 130 printf("ディーラーがカードを引いています。少々お待ちください\n"); 131 n=read(sock,bufdh,sizeof(bufdh)); 132 if (n < 0) { 133 perror("read"); 134 printf("%d¥n", errno); 135 return 1; 136 } 137 printf("ディーラーの数字が確定しました。次はあなたのターンです。\n\n\n"); 138 bufd=atoi(bufdh); 139 140 while(1){ 141 if(all>21){ 142 printf("あなたの手札は%dでバーストしてしまいました。\n",all); 143 all=100; 144 break; 145 } 146 printf("現在のあなたのカードの合計は%dです\n",all); 147 printf("ヒットしますか?スタンドしますか?\n"); 148 printf("ヒット: 0 スタンド: 1 ----->"); 149 150 scanf("%s",hit2); 151 hit=atoi(hit2); 152 153 154 if(hit==1){ 155 printf("%dでスタンドします。\n",all); 156 break; 157 } 158 else if(hit==0) { 159 160 new[j]=rand()%10+1; 161 printf("あなたは%dを引きました\n",new[j]); 162 163 if(new[j]==1){ 164 printf("今引いたカードがAなのでで1か10を選択してください\n" ); 165 printf("1 OR 10 ----->"); 166 scanf("%d",&t); 167 new[j]=t; 168 169 } 170 all=all+new[j]; 171 j++; 172 173 174 } 175 else{ 176 printf("0か1を入力してください\n"); 177 } 178 179 180 } 181 182 183 if(all>bufd||bufd==100){ 184 printf("YOU WIN!!!!!\n\n\n"); 185 if(bufd==100){ 186 printf("ディーラーはバーストしました\n"); 187 } 188 else{ 189 printf("ディーラーのカードの合計値は%dでした\n",bufd); 190 } 191 192 193 } 194 else if(all==bufd||bufd!=100){ 195 printf("DRAW.....\n"); 196 } 197 else if(all<bufd && bufd!=100){ 198 printf("YOU LOSE......\n\n\n"); 199 200 printf("ディーラーのカードの合計値は%dでした\n",bufd); 201 } 202 203 else if (all==100 && bufd==100){ 204 printf("お互いにバーストしました\n"); 205 } 206 207 208 209 210 211 212 213 214 /* 文字送信 */ 215 /* write0= write(sock, argv[3], sizeof(argv[3])); 216 217 if (write0 < 0) { 218 perror("write"); 219 printf("%d¥n", errno); 220 return 1; 221 } 222 223 n2=read(sock,buf2,sizeof(buf2)); 224 printf("%s \n",buf2);*/ 225 printf("ゲームを終了します。お疲れ様でした。\n"); 226 227 /* TCP セッションの終了 */ close(sock); 228 229 return 0; 230 231} 232

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

new[j]=rand()%10+1;

jには何が入ってるんでしょうか。


scanf("%s",hit2);

これもダメですね
入力文字列が入る場所がありません。
hit2を配列にしましょう

投稿2020/11/06 04:41

編集2020/11/06 13:13
y_waiwai

総合スコア88042

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/11/06 07:37

ご回答ありがとうございます。 何も定義しなければ’0'が入っているものだと勘違いしていました。 ご指摘ありがとうございます。
退会済みユーザー

退会済みユーザー

2020/11/06 10:39

ちなみになのですが、手札が毎回10と8にしかならないのは何が原因なのでしょうか?
y_waiwai

2020/11/06 10:46

rand関数ででてくる乱数は、とある計算で算出されます(ぐぐれば詳細が出てきます) ということは、同じ順番で出していけば、常に同じ値が出てくるってことです。 これをどうにかするためには、この乱数の初期値を変えてやる必要があります srand関数で初期値を変えれますが、これまた同じ初期値ではおなじ乱数がでてきてしまうのは変わりません
退会済みユーザー

退会済みユーザー

2020/11/06 11:20

ありがとうございます。 #include <time.h> srand(time(NULL));を追加することで実装できました。 int jについてなんですが、初期化とはどういう処理なのでしょうか? int j=0で初期化と言えるのでしょうか?
y_waiwai

2020/11/06 11:56

> int j=0で初期化と言えるのでしょうか? それでいいです。 #そこで必要とされるのが0かどうかは私にはわかりませんが
退会済みユーザー

退会済みユーザー

2020/11/06 12:06

初期化したところで実行に変わりがありません。 int new[128]; ここに問題があるのではないのでしょうか?
退会済みユーザー

退会済みユーザー

2020/11/06 12:08

このコードはクライアント側なのですが、サーバー側は同じコードでもエラーを吐きません。 何故でしょうか、、、
y_waiwai

2020/11/06 12:21 編集

> scanf("%s",hit2); これもダメですね 入力文字列が入る場所がありません。 hit2を配列にしましょう
退会済みユーザー

退会済みユーザー

2020/11/06 12:22

すいません、そのコメントを見る前に配列に直して実行したら実装できました。 長々とありがとうございました。
guest

0

jが初期化されてませんね。

というか、もう少し関数分割した方がいいですよ。
main関数だけで実装しようとするから恐らくご自身でも追いづらい(見通しの悪い)コードになっています。
関数を小分けにするだけでもデバッグ効率上がりますよ。

投稿2020/11/06 05:09

DreamTheater

総合スコア1095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/11/06 07:36

ご回答ありがとうございます。 初期化というのはintの定義のところで j=0とするということでしょうか? なるほど。関数化をしたら見やすくなるのですね。 一度してみます。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問