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

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

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

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

Q&A

解決済

5回答

2342閲覧

【C言語】switch文について

f.Shou

総合スコア1

C

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

0グッド

0クリップ

投稿2020/05/23 11:55

編集2020/05/23 12:32

今、C言語でswitch文を学んでいます。
今まで学んだ内容は
・printf()
・scanf()
・if文
・switch文
です。

そこで質問なのですが、
switch文の中にswitch文を半永久的に書くことは出来ますか?

野球のテキストゲームを作ろうと思っていて、
3つの選択肢を最大で6回選んでもらおうとおもっています。

そうなると例えば
case1の中にswitch文が入り、
そのswitch文の中のcase1にswitch文を書くみたいなことになります。

そしたらエラーが出てしまったので困っています。

【環境など】
・Windows10
・Microsoft VisualStudio 2017

【エラー内容】
・case ラベル値はこのスイッチ 行 130 で既に設定されています
・default ラベルはこのスイッチで既に使用されています
・switch 文の中に 2 つ以上の 'default' があります。
・{;に一致するトークンが見つかりませんでした。
【警告内容】
・'scanf' : 書式文字列 '%s' には、型 'char *' の引数が必要ですが、可変個引数 1 は型 'int *' です
・'printf' : 書式文字列 '%s' には、型 'char *' の引数が必要ですが、可変個引数 1 は型 'int *' です

【コード】

int main( void ) { int tensai, throw1, throw2, throw3, throw4, throw5, throw6, throw7; printf("\n\n\n\n\n\n\n\n"); printf("       天才バッターの名前を入力してね\n\n\n\n"); printf(" → "); scanf("%s", &tensai); system("cls"); printf("\n\n\n\n"); printf(" 実況「さあ、試合も大詰め!」\n\n\n\n"); printf(" 実況「9回ツーアウト満塁!」\n\n\n\n"); printf(" 実況「一打逆転のチャンスで打席にはバッターの ”%s!”」\n\n\n\n",&tensai); printf("  実況「ピッチャー第1球、投げました!」\n\n\n\n"); printf(" (1球目が来た。1:ストレート 2:カーブ 3:見送る)\n\n"); printf("  → "); scanf("%d",&throw1); system("cls"); switch (throw1) { case 1: printf("\n\n\n\n\n"); printf(" 主審「ストライ~ク!!」\n\n\n\n"); printf(" 実況「1球目はボール球を空振り」\n"); // キー入力待ち rewind(stdin); _getch(); system("cls"); printf("\n\n\n\n\n"); printf("  実況「ピッチャー第2球、投げました!」\n\n\n\n"); printf(" (2球目が来た。1:ストレート 2:カーブ 3:見送る)\n\n"); printf("  → "); scanf("%d", &throw2); system("cls"); switch (throw2) { case 1: printf("\n\n\n\n\n"); printf(" 主審「ストライ~ク!!」\n\n\n\n"); printf(" 実況「2球目も空振り~」\n"); break; case 2: printf("\n\n\n\n\n"); printf(" 主審「ストライ~ク!!」\n\n\n\n"); printf(" 実況「2球目も空振り~」\n"); break; default: printf("\n\n\n\n\n"); printf(" 主審「ボール!!」\n\n\n\n"); printf(" 実況「2球目は少し外れてボール!!」\n"); // キー入力待ち rewind(stdin); _getch(); system("cls"); printf("\n\n\n\n\n"); printf("  実況「ピッチャー第3球、投げました!」\n\n\n\n"); printf(" (3球目が来た。1:ストレート 2:カーブ 3:見送る)\n\n"); printf("  → "); scanf("%d", &throw3); system("cls"); switch (throw3) { case 1: printf("\n\n\n\n\n"); printf(" 主審「」\n\n\n\n"); printf(" 実況「」\n"); break; case 2: printf("\n\n\n\n\n"); printf(" 主審「」\n\n\n\n"); printf(" 実況「」\n"); break; default: printf("\n\n\n\n\n"); printf(" 主審「ボール!!」\n\n\n\n"); printf(" 実況「3球目も少し外れてボール!!」\n"); // キー入力待ち rewind(stdin); _getch(); system("cls"); printf("\n\n\n\n\n"); printf("  実況「ピッチャー第4球、投げました!」\n\n\n\n"); printf(" (4球目が来た。1:ストレート 2:カーブ 3:見送る)\n\n"); printf("  → "); scanf("%d", &throw4); system("cls"); switch (throw4) { case 1: printf("\n\n\n\n\n"); printf(" 主審「」\n\n\n\n"); printf(" 実況「」\n"); break; case 2: printf("\n\n\n\n\n"); printf(" 主審「」\n\n\n\n"); printf(" 実況「」\n"); break; default: printf("\n\n\n\n\n"); printf(" 主審「ストライ~ク!!」\n\n\n\n"); printf(" 実況「4球目はストライク!!」\n\n\n\n"); printf(" 実況「これでカウント 2ボール 2ストライク」\n"); break; } break; } break; case 2: printf("\n\n\n\n\n"); printf(" 主審「ストライ~ク!!」\n\n\n\n"); printf(" 実況「一球目はボール球を空振り」\n"); // キー入力待ち rewind(stdin); _getch(); system("cls"); printf("\n\n\n\n\n"); printf(" (2球目が来た。1:ストレート 2:カーブ 3:見送る)\n\n"); printf("  → "); scanf("%d", &throw2); system("cls"); switch (throw2) { case 1: printf("\n\n\n\n\n"); printf(" 主審「ストライ~ク!!」\n\n\n\n"); printf(" 実況「二球目も空振り~」\n"); break; case 2: printf("\n\n\n\n\n"); printf(" 主審「ストライ~ク!!」\n\n\n\n"); printf(" 実況「二球目も空振り~」\n"); break; case 9: printf("\n\n\n\n\n"); printf(" 主審「ボール!!」\n\n\n\n"); printf(" 実況「二球目は少し外れてボール!!」\n"); break; } break; default: printf("\n\n\n\n\n"); printf(" 主審「ボール!!」\n\n\n\n"); printf(" 実況「一球目は少し外れてボール!!」\n"); break; } // キー入力待ち rewind(stdin); _getch(); return 0; }

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

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

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

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

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

cateye

2020/05/23 11:58

エラーの出たコードを提示して下さい。また、環境(OSやコンパイラ)を教えて下さい。
Zuishin

2020/05/23 12:13

多分、switch のネストではなく配列とループを使う場面だと思います。
f.Shou

2020/05/23 12:31

編集しました! switchまでの範囲でお願いしたいです。 6段くらいを想定してます。
cateye

2020/05/23 13:07

何でもかんでもmain()に詰め込もうとしないで、関数に任せましょう。196行は多すぎると思います。 ・・・・・・ストックフォームの行数(66)・・・大抵60行には収まります・・・デバグも楽w
f.Shou

2020/05/23 13:11

すみません。ほんとに素人なのでmain()に入れるやり方しか分からないのです(><) たぶん、持ってる知識より複雑なことをやろうとしてることが分かりました…
thkana

2020/05/23 22:16

ストックフォームって...若者には通じませんて。
guest

回答5

0

普通に書けます。

C

1swicth (x) { 2 case 1: 3 switch (y) { 4 case 10: 5 break; 6 case 11: 7 break; 8 // ... 9 } 10 break; 11 case 2: 12 break; 13 default: 14 break; 15}

実際のエラーが出たコードを示してください。

投稿2020/05/23 12:01

pepperleaf

総合スコア6385

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

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

f.Shou

2020/05/23 12:33

コード書かせてもらいました。
pepperleaf

2020/05/23 12:40

コードを見る限り、単純に、 {} の組合せがあっていないだけのようです。 深すぎるネストもバグの元なので、適当にサブルーチンとか、考えましょう。 また、出ている警告もそのままでは、正しく動きません。修正しましょう。
f.Shou

2020/05/23 12:45

やってみます
guest

0

回答ではありませんが、for文にしてみました。
投球数(no)が変化するので、投球毎に何かしないとですねd^^
あと、ファールとか何も考えてないです^^;

c

1#include <stdio.h> 2// 3int main(void) 4{ 5 int throw = 0; 6 char tensai[16]; 7 // 8 printf("\n\n\n\n\n\n\n\n"); 9 printf("       天才バッターの名前を入力してね\n\n\n\n"); 10 printf(" → "); 11 scanf("%s", tensai); 12 // 13 printf("\n\n\n\n"); 14 printf(" 実況「さあ、試合も大詰め!」\n\n\n\n"); 15 printf(" 実況「9回ツーアウト満塁!」\n\n\n\n"); 16 printf(" 実況「一打逆転のチャンスで打席にはバッターの %s!”」\n\n\n\n", tensai); 17 // 18 for(int i = 0; i < 4; i++) { 19 int no = i + 1; 20 // 21 printf("  実況「ピッチャー第%d球、投げました!」\n\n\n\n", no); 22 printf(" (%d球目が来た。1:ストレート 2:カーブ 3:見送る)\n\n", no); 23 printf("  → "); 24 // 25 if(scanf("%d", &throw) != 1) { 26 puts("数字以外が入力されました。"); 27 break; 28 } 29 // 30 switch(throw) { 31 case 1: 32 printf("\n\n\n\n\n"); 33 printf(" 主審「ストライ~ク!!」\n\n\n\n"); 34 printf(" 実況「%d球目も空振り~」\n", no); 35 break; 36 37 case 2: 38 printf("\n\n\n\n\n"); 39 printf(" 主審「ストライ~ク!!」\n\n\n\n"); 40 printf(" 実況「%d球目も空振り~」\n", no); 41 break; 42 43 default: 44 printf("\n\n\n\n\n"); 45 printf(" 主審「ボール!!」\n\n\n\n"); 46 printf(" 実況「%d球目は少し外れてボール!!」\n", no); 47 } 48 // キー入力待ち 49 getchar( ); 50 // 51 } 52 // キー入力待ち 53 getchar( ); 54 // 55 return 0; 56}

投稿2020/05/23 16:13

編集2020/05/23 20:38
cateye

総合スコア6851

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

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

cateye

2020/05/23 16:19 編集

clangあるいはLinux環境で使えないライブラリは、削除するかコメントアウトしてあります。
guest

0

ベストアンサー

switch文は
switch(式){
}
が一つの塊になります。これを着実に守って下さい。

C

1switch(){//外側のswitch文は内側のswitch文をその中に包んでいること 2 switch(){ 3 switch(){ 4 } 5 } 6}

という対応が守られていないからエラーになったのが今回の問題のひとつです。

ところで、

野球のテキストゲームを作ろうと思っていて、

3つの選択肢を最大で6回選んでもらおうとおもっています。

というのは、あなたが考えた題材なんでしょうか。
switch文で書こうと思えば書けるということと、switchで書くのが適しているかどうかということは別の問題です。参考。他のサイトなのでリンク切れしたら御免
指定された題材ならとりあえず仕方ないのでやるにしても、自分で考えた題材なら、そこを考え直した方がいいのかも知れません。まぁ、他のお題を考えるのも大変でしょうが。

投稿2020/05/23 22:32

thkana

総合スコア7703

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

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

0

「switch (throw4)」のとじカッコ「}」が抜けてます。

自分はvimというテキストエディタの対応カッコ検索機能を使って見つけました。
カッコの位置にカーソルを合わせて「%」キーを押すと対応するカッコにジャンプするので
意図しないジャンプをするところを探せば見つかります。
多分、他のテキストエディタでも同様な機能はあると思います。

ただブロックがこんなに長い行になっていると、他人が見ることを想定しても自分が後で見返す時のことを考えても見るのがつらいと思うので、他の方がおっしゃっているように別関数に切り出すなどして大きなブロックを作らないように工夫したほうが良いかと思います。

投稿2020/05/23 13:01

hidezzz

総合スコア1248

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

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

f.Shou

2020/05/23 13:07

ありがとうございます! 他の関数の方が良さそうなことはたくさんの方からご指摘いただいてその通りだと思いました。 が、習ってないこと以外は使っては行けないという課題の制約があるのでそれは出来ないのです。 switchの段が6段くらいになりそうなので諦めます。 ご回答ありがとうございました。
hidezzz

2020/05/23 13:09

先生は見るのつらくないんですかねw
f.Shou

2020/05/23 13:12

おそらくここまで変な(めんどくさい)ことしてくるやつはいないだろう。ということなのでしょう笑
hidezzz

2020/05/23 13:19

関数の有用性を教えるためにわざと後で教える作戦かもw
guest

0

できます。
エラーが出てるのは書き方が間違ってるからですね


その出ているエラー文を読みましょう。
どこの行でどういうエラーなにか書いてくれているのですから、読まないともったいないですよ。
ほとんど書き方が間違ってるってエラーですね

投稿2020/05/23 11:56

編集2020/05/23 12:32
y_waiwai

総合スコア88042

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

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

f.Shou

2020/05/23 11:59

回答ありがとうございます! その場合、case1やdefaultなど何回も使用して大丈夫なのでしょうか?
Zuishin

2020/05/23 12:00

ほんとに無限に近く書いたら、多分スタックオーバーフローになるんじゃないでしょうか。
y_waiwai

2020/05/23 12:01

大丈夫ですよ
Zuishin

2020/05/23 12:04

ジャンプテーブルやスイッチに使うローカル変数がスタック消費しませんか?
y_waiwai

2020/05/23 12:06

まー三段階や四段階ぐらいのネストではびくともしないでしょ
Zuishin

2020/05/23 12:08

それくらいだとそうですね。質問も半永久的と書いてるけど、実際に聞きたいのはネストできるかどうかということみたいですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問