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

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

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

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

Q&A

解決済

1回答

4283閲覧

C言語のコードで、なぜエラーが発生するのかわからない。

nachu_

総合スコア3

C

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

0グッド

0クリップ

投稿2021/07/22 18:19

前提・実現したいこと

プログラミングの授業の自由課題ですごろくゲームを作成しているのですが、なぜエラーがでてくるのかがわかりません。
全角になっているところがあるのかと思い一度初めから打ち直してみたのですが、依然として同じエラーが発生してしまっています。
原因がわかる方、よければ教えていただけると幸いです。

発生している問題・エラーメッセージ

300:5: warning: data definition has no type or storage class getchar(); ^~~~~~~ 300:5: warning: type defaults to 'int' in declaration of 'getchar' [-Wimplicit-int] 301:13: error: expected declaration specifiers or '...' before string constant printf("\n~今回の結果~\n"); ^~~~~~~~~~~~~~~~~~~~ 302:5: warning: data definition has no type or storage class getchar(); ^~~~~~~ 302:5: warning: type defaults to 'int' in declaration of 'getchar' [-Wimplicit-int] 303:5: error: expected identifier or '(' before 'if' if(p1->position == MAX){ ^~ 306:5: error: expected identifier or '(' before 'else' else if(p2->position == MAX){ ^~~~ 309:1: error: expected identifier or '(' before '}' token } ^

該当のソースコード

C

1#include <stdio.h> 2#include <stdlib.h> 3#include <string.h> 4#include <time.h> 5 6#define MAX 20 //マスの数 7 8typedef struct { 9 char *name; //Playerの名前 10 char *icon; //すごろくで表示するアイコン 11 int position; //Playerの位置 12 int value; //Playerの成功値 13}Player; 14 15void rule(void); //タイトル画面の表示 16void input(Player*,Player*); //入力 17void successValue(Player*,Player*); //成功値の決定 18void field(Player*); //すごろくの状態 19int turn(Player*,Player*); //すごろくを進める 20int success(Player*,Player*,int); //判定成功の処理 21int special(Player*,Player*); //特殊マスチェック 22void failure(Player*,Player*,int); //判定失敗の処理 23void damage(Player*,Player*); //相手をスタートに戻す処理 24void result(Player*,Player*); //結果発表 25 26int main(void){ 27 Player player1,player2; //Player 28 Player *p1,*p2; //Playerのポインタ 29 int g; //ゴールの判定(ゴールしたら-1) 30 srand(time(NULL)); 31 32 p1 = &player1; 33 p2 = &player2; 34 35 //位置の初期化 36 p1->position = 0; 37 p2->position = 0; 38 39 rule(); //タイトル画面の表示 40 system("cls"); //画面クリア 41 input(p1,p2); //入力 42 getchar(); 43 successValue(p1,p2); //成功値の決定 44 getchar(); 45 system("cls"); //画面クリア 46 47 //初期位置の表示 48 field(p1); 49 field(p2); 50 printf("\n"); 51 52 //ゲーム開始 53 while(1){ 54 g = turn(p1,p2); //player1のターン(-1が戻されるとゴールなのでbreak) 55 if(g == -1) break; 56 g = turn(p2,p1); //player2のターン(-1が戻されるとゴールなのでbreak) 57 if(g == -1) break; 58 } 59 60 //最終状態 61 result(p1,p2); 62 63 return 0; 64} 65 66//タイトル画面の表示 67void rule(void){ 68 printf("*すごろくゲーム*\n"); 69 printf("\n"); 70 printf(" ルール\n"); 71 printf("  1.はじめに1d100のダイスを振り、成功値を決定する。\n"); 72 printf("    成功値は必ず 31 以上 90 未満の数字になります。\n"); 73 printf("  2.各々のターンの前に毎回1d100ダイスを振り、成功値以下の出目が出れば\n"); 74 printf("    すごろくを進めるための1d6ダイスを振ることができる。\n"); 75 printf("  成功値よりも大きい出目だった場合は1回休み。\n"); 76 printf("  1d100ダイスの出目で、1~5だった場合は1d6ダイスの分に加えて1マス進むことができる。\n"); 77 printf("   逆に、96~100だった場合は1マス戻って一回休み。\n"); 78 printf("   3.相手と同じマスに止まった場合、相手をスタート地点まで戻すことができる。\n"); 79 printf("   特殊マスに止まった場合、マスの効果に応じてさらに進んだり戻ったりする。\n"); 80 printf("  4.先に20マス進めたほうが勝ち。\n"); 81 printf("\n"); 82 printf(" 特殊マス\n"); 83 printf("  5 :3マス進む\n"); 84 printf("  10:スタートに戻る\n"); 85 printf("  15:4マス戻る\n"); 86 printf("\nEnterを押してスタート"); 87 getchar(); //エンターが入力されるまで待機 88} 89 90//入力 91void input(Player *p1,Player *p2){ 92 char str[100]; 93 94 //Player1の入力 95 printf("Player1の名前を入力してください..."); 96 scanf("%s",str); 97 p1->name = (char *)malloc( sizeof(char) * (strlen(str)+1) ); 98 strcpy(p1->name,str); 99 100 printf("%sのアイコンを入力してください(全角1文字推奨)...",p1->name); 101 scanf("%s",str); 102 p1->icon = (char *)malloc( sizeof(char) * (strlen(str)+1) ); 103 strcpy(p1->icon,str); 104 105 106 //Player2の入力 107 printf("Player2の名前を入力してください..."); 108 scanf("%s",str); 109 p2->name = (char *)malloc( sizeof(char) * (strlen(str)+1) ); 110 strcpy(p2->name,str); 111 112 printf("%sのアイコンを入力してください(全角1文字推奨)...",p2->name); 113 scanf("%s",str); 114 p2->icon = (char *)malloc( sizeof(char) * (strlen(str)+1) ); 115 strcpy(p2->icon,str); 116 117 //入力の確認 118 printf("\nPlayer1...%s アイコン...%s\n",p1->name,p1->icon); 119 printf("Player2...%s アイコン...%s\n",p2->name,p2->icon); 120} 121 122//成功値の決定 123void successValue(Player *p1,Player *p2){ 124 printf("\n成功値を決定します。\n"); 125 getchar(); 126 while(1){ 127 p1->value = (rand()%100) + 1; //1~100 128 p2->value = (rand()%100) + 1; 129 if(p1->value > 30 && p1->value < 90 && p2->value > 30 && p2->value < 90){ 130 break; 131 } 132 } 133 printf("%sの成功値:%d\n",p1->name,p1->value); 134 printf("%sの成功値:%d\n",p2->name,p2->value); 135} 136 137//すごろくの状態 138void field(Player *p){ 139 int i; 140 141 printf("\n%s\n",p->name); 142 for(i = 0; i < MAX; i++){ 143 if(i == p->position) printf("%s",p->icon); 144 else if(i == 0) printf("[START]"); 145 else if(i == 5) printf("5"); 146 else if(i == 10) printf("10"); 147 else if(i == 15) printf("15"); 148 else printf("・"); 149 } 150 //ゴールの表示 151 if(p->position < MAX) printf("[GOAL]"); 152 else printf("%s",p->icon); 153 printf("\n"); 154} 155 156//すごろくを進める 157int turn(Player *p,Player *po){ 158 int dice; 159 int g = 2; 160 161 getchar(); 162 printf("\n%sのターン!成功値の判定をします。(成功値...%d)\n",p->name,p->value); 163 getchar(); 164 dice = (rand()%100) + 1; 165 166 if(dice <= p->value){ //成功 167 g = success(p,po,dice); 168 } 169 else if(dice > p->value){ //失敗 170 failure(p,po,dice); 171 } 172 173 system("cls"); 174 field(p); 175 field(po); 176 177 return g; 178} 179 180//判定成功の処理 181int success(Player *p,Player *po,int dice){ 182 int g = 2; 183 184 //大成功 or 成功 185 if(dice <= 5) { 186 printf("%d...大成功!1マスおまけで進めます。\n",dice); 187 p->position = p->position + 1; 188 } 189 else { 190 printf("%d...成功!サイコロを振ります。\n",dice); 191 } 192 193 //1d6 194 getchar(); 195 dice = (rand()%6) + 1; //1~6 196 printf("%dが出ました。",dice); 197 getchar(); 198 p->position = p->position + dice; 199 200 g = special(p,po); 201 202 return g; 203} 204 205//特殊マスチェック 206int special(Player *p,Player *po){ 207 int g = 2; 208 209 //ゴールしたとき 210 if(p->position >= MAX){ 211 p->position = MAX; 212 g = -1; 213 return g; 214 } 215 //5マス 216 else if (p->position == 5){ 217 system("cls"); 218 field(p); 219 field(po); 220 221 printf("\nラッキーマス!"); 222 getchar(); 223 printf("やったね!3マス進めます。\n"); 224 p->position = p->position + 3; 225 getchar(); 226 if(p->position == po->position){ 227 field(p); 228 field(po); 229 damage(p,po); 230 } 231 return g; 232 } 233 //10マス 234 else if (p->position == 10){ 235 system("cls"); 236 field(p); 237 field(po); 238 239 printf("\nトラップマス!"); 240 getchar(); 241 printf("残念!スタートに戻ります。"); 242 p->position = 0; 243 getchar(); 244 return g; 245 } 246 //15マス 247 else if (p->position == 15){ 248 system("cls"); 249 field(p); 250 field(po); 251 252 printf("\nトラップマス!"); 253 getchar(); 254 printf("残念!4マス戻ります。"); 255 p->position = p->position - 4; 256 getchar(); 257 if(p->position == po->position){ 258 field(p); 259 field(po); 260 damage(p,po); 261 } 262 return g; 263 } 264 265 return g; 266 267} 268 269//判定失敗の処理 270void failure(Player *p,Player *po,int dice){ 271 if(dice > 95){ 272 printf("%d...大失敗!1マス戻ります。",dice); 273 p->position = p->position - 1; 274 if(p->position < 0){ 275 p->position = 0; 276 } 277 if(p->position == po->position){ 278 field(p); 279 field(po); 280 damage(p,po); 281 } 282 } 283 else{ 284 printf("%d...失敗!1回休みです。",dice); 285 } 286 getchar(); 287} 288 289//相手をスタートに戻す処理 290void damage(Player *p,Player *po){ 291 printf("ハプニング発生!"); 292 getchar(); 293 printf("%sと同じマスに止まりました。%sはスタートに戻されます。",po->name,po->name); 294 po->position = 0; 295 getchar(); 296} 297 298//結果発表 299void result(Player *p1,Player *p2){ 300 getchar(); 301 printf ("\n~今回の結果~\n"); 302 getchar(); 303 if(p1->position == MAX){ 304 printf("  %sの勝利!\n\n",p1->name); 305 } 306 else if(p2->position == MAX){ 307 printf("  %sの勝利!\n\n",p2->name); 308 } 309}

試したこと

VScode以外にideoneでも試してみたのですが、そちらだとsystem("cls")の処理をしない状態で成功しました。なぜVScodeでだけエラーが出てくるのでしょうか?

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

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

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

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

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

jimbe

2021/07/22 19:17

「~今回の結果~」を表示している printf の行をコメントアウトしたら、どうなるでしょうか。
guest

回答1

0

ベストアンサー

ソースコードをUTF-8で保存してください。

C

1//結果発表 2void result(Player *p1,Player *p2){

Shift-JISだと'表'の文字コードが0x95 5cなので、0x5cがエスケープコードとして作用して改行コードが食われてしまって関数のシグニチャ行がコメントに取り込まれてしまったのでしょう。

VSCodeで作業をしているということはgccですね? であれば、encodingは常にUTF-8にしておいて問題はないはずです。

ideoneには、ブラウザに貼り付ける時点で内部的にエンコードの変換が行われているのでしょう。

投稿2021/07/22 22:15

thkana

総合スコア7703

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

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

Zuishin

2021/07/22 23:09

試していませんが、コメントでもエスケープは有効なんですね。
nachu_

2021/07/22 23:53

解決しました!ありがとうございます!
pepperleaf

2021/07/23 02:57 編集

既に解決済みのようですが、 多分、コンパイル時の文字コードが UTF-8 とかになっているのでは? 昔、コンパイラが S-JIS対応になってなくて、// コメント禁止になっていた事があります。(20年位前) いまだにあるんだ、、と。 もっとも最近、日本語(と言うより、日本)の扱いが、低下してるようなので、考慮されなくなったのかも。 (追記) この場合、文字列("")/文字('')も同様の問題。ただ、禁止となったところは文字列に日本語はあり得なかった(組み込み)ので、実害が無かった。参考までに
otn

2021/07/23 02:39

gccなら、-finput-charset=CP932 のコンパイルオプションでSJISのソースに対応可能です。 コンパイラに「エンコーディング自動判定」を求めるのは何か違うと思うので、オプションで切り替えというのは妥当な仕様でしょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問