• ベストアンサー

初心者です。C言語でクイズを作っています。

下のようなプログラムを作ってみたのですが、 コンパイルエラーがでます。 どうか教えて頂けないでしょうか? これは、コンパイルエラーの文です。 $ gcc -o quiz2.exe quiz2.c quiz2.c: In function `main': quiz2.c:10: `y' undeclared (first use in this function) quiz2.c:10: (Each undeclared identifier is reported only once quiz2.c:10: for each function it appears in.) quiz2.c:29: parse error before `}' quiz2.c:39: parse error before `}' quiz2.c:46: parse error at end of input そして、このようなソースを作りました。 #include <stdio.h> main() { char ans, ans3; int ans2; printf("クイズを出題します。 y/n -->"); ans = getchar(); if(ans==y) { printf("目*花*歯があるのに口がないのなに?"); printf("1:包丁 2:植物 3:ロボット"); scanf("%d",&ans2); if(ans2==2) { printf("正解"); } if(ans2==1||ans2==3) { printf("ハズレ もう一度する? y/n"); ans3 = getchar(); if(ans3==y) { return(1) } else { printf("ゲームを終了"); } } else { printf("半角数字の1~3を入力して"); return(1) } } else { printf("またチャレンジしてね"); } } /*尚、環境はcygwinのgccを使っています。*/ 文字数が足りないので、printfの中などは少し省いてあります。

質問者が選んだベストアンサー

  • ベストアンサー
  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.4

対話入力にgetchar(3)やscanf(3)は、予想と違う結果をもたらし使いにくい関数です。gets(3)はバッファオーバーフローの危険があるのでfgets(3)を使いましょう。 -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- #include <stdio.h> char getans(void) { char buf[BUFSIZ]; fgets(buf, BUFSIZ, stdin); return (buf[0]); } int main(void) { char ans; while (1) { printf("クイズを出題します。 y/n -->"); if (getans() == 'n') { break; } printf("目*花*歯があるのに口がないのなに?\n"); printf("1:包丁 2:植物 3:ロボット -->"); if ((ans = getans()) == '2') { printf("正解\n"); break; } else if (ans == '1' || ans == '3') { printf("ハズレ もう一度する? y/n -->"); if (getans() == 'n') { printf("ゲームを終了\n"); break; } } else { printf("半角数字の1~3を入力して\n"); } } printf("またチャレンジしてね\n"); return (0); }

hiro_wide
質問者

お礼

回答ありがとうございます。 こちらも、無事コンパイル&実行できました。 軽くソースを読んでみましたが、 最初に書いてある char buf[BUFSIZ]; fgets(buf, BUFSIZ, stdin); return (buf[0]); 周辺があやふやです。 これから、しっかりと勉強したいと思います。 ありがとうございました。

その他の回答 (3)

  • aqfe
  • ベストアンサー率53% (15/28)
回答No.3

#2です >ans,ans2はchar型 ansとans3でしたね、すみません。

  • aqfe
  • ベストアンサー率53% (15/28)
回答No.2

回答の最後の方にプログラムを書いておきます。 訂正箇所はくどくなってしまいましたが、「ココ」とコメントを付け加えておきました。 ans,ans2はchar型なので「y」を文字と認識させるために「'y'」とシングルクォーテーションで囲みます。 あとreturn命令のときもセミコロンは要りますよ。 それと、※のところのelse ifはないと意図した動作はしないです。 ※※のところgetchar()は、(このあたりはちょっと知識が必要なのですが)連続して使うと文字列の最後を示すコード(\0だったか0だったか忘れました)を読み取ってしまうので、scanfなどを使うほうがよいです。 ただscanfはちょっと癖のある関数でして、連続で使う場合は注意が必要です。 下のほうのプログラムでは復改を読み飛ばすようにしています(←意味不明だったらあまり気にせず読み飛ばしてください) まぁscanfも実はあまり推奨されないんですけどね。。。 以下にプログラム載せておきます。 #include <stdio.h> main(){ char ans, ans3; int ans2; printf("クイズを出題します。 y/n -->"); scanf("%c%*c",&ans); /** ココと※※ **/ if(ans=='y'){ /** ココと **/ printf("目*花*歯があるのに口がないのなに?"); printf("1:包丁 2:植物 3:ロボット"); scanf("%d%*c",&ans2); /** ココと※※ **/ if(ans2==2){ printf("正解"); } else if(ans2==1||ans2==3){ /** ココと※ **/ printf("ハズレ もう一度する? y/n"); scanf("%c%*c",&ans3); /** ココと※※ **/ if(ans3=='y'){ /** ココと **/ return(1); /** ココと **/ } else{ printf("ゲームを終了"); } } else{ printf("半角数字の1~3を入力して"); return(1); /** ココ **/ } } else{ printf("またチャレンジしてね"); } }

hiro_wide
質問者

お礼

ありがとうございます。 コンパイル&実行できました。 どうやら、scanfやgetchar関数あたりが謎ですね。 色々なプログラムを作って、理解していきたいと思います。 ありがとうございました。

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

プログラムはとりあえずおいといて コンパイルエラーについて ans=='y' のようにする必要があります。 return (1); のようにセミコロンが必要です。

hiro_wide
質問者

お礼

回答ありがとうございます ans=='y' と言う事ですが、if文では数字以外の場合はアポストロフィを使うのですね。 勉強になりました。 ありがとうございました。

関連するQ&A

  • C言語のプログラミングがうまくいきません!

    先日のプログラムを作り直しました。アドバイスのおかげでエラーは減りましたが、まだ完ぺきではないようです。恐らく、elseのところがいけないと思うのですが、どうしたらいいか分かりません。 ご指摘お願いします。 #include <stdio.h> #include <math.h> void main(void) { double x ,y ,z ,error ,menseki ; double ans; printf("x ?"); scanf("%lf", &x); printf("y ?"); scanf("%lf", &y); printf("z ?"); scanf("%lf", &z); if(x<y+z || y<x+z || z<x+y) { ans=(x+y+z)/2; menseki=sqrt(ans*(ans-x)*(ans-y)*(ans-z)); } if(x==y && y==z && z==x) { printf("正三角形です"); printf("面積は%lfです" , menseki); } else if(x==y || y==z || z==x) { printf("二等辺三角形です"); printf("面積は%lfです" , menseki); } else { printf("三角形です"); printf("面積は%lfです" , menseki); } else { printf("error"); } }

  • C言語、関数、ポインタ、エラー見つけられません。

    いつも大変お世話になり誠にありがとうございます。 標記の件。 エラーが見つけられません。 どうかアドバイスをください。       記 コード #include <stdio.h> double avg(int *pT); int main(void) { int rest[5]; int i; double ans; printf("5人のテストの点数を入力してください。\n"); for(i=0; i<5; i++){ scanf("%d", &test[i]); } ans = avg(test); printf("5人の平均点は%lf点です。\n", ans); return 0; } /*avg関数の定義*/ double avg(int *pT) { int i; double sum; sum = 0.0; for(i=0; i<5; i++){ sum += pT[i]; } return sum/5; } コンパイラーエラー C:\MinGW>gcc text19.c -o text19 text19.c: In function 'main': text19.c:14:22: error: 'test' undeclared (first use in this function) scanf("%d",&test[i]); ^~~~ text19.c:14:22: note: each undeclared identifier is reported only once for each function it appears in 14行目にエラーがあるのかな?と思いますが 間違っていないようです。 ご多忙中恐れ入ります。 ご回答の程宜しくお願い申し上げます。

  • C言語のプログラミングがうまくいきません!

    とりあえず、自分でプログラムしましたが、どこか間違っているようです。僕のプログラムを載せますので、どこが間違っているのか教えて下さい。あと、正しいプログラムを書いていただければ幸いです。 3つの辺の長さをx、y、zに代入して三角形が成立すれば、その形状と面積をヘロンの公式を使って求める。 #include <stdio.h> #include <math.h> { double x ,y, z ,error ,menseki ,ans; printf("x ?") scanf("%f" , &x); printf("y ?") scanf("%f" , &y); printf("z ?") scanf("%f" , &z); ans=(x+y+z)/2; menseki=sqrt(ans*(ans-x)*(ans-y)*(ans-z)); if (x === y || y == z || x == z) { printf ("正三角形です"); printf("面積は%dです" , menseki); } else if (x == y || y == z || z == x) { printf("二等辺三角形です"); printf("面積は%dです" , menseki); } else { printf("三角形です"); printf("面積は%dです , menseki); if(x<y+z || y<x+z || z<x+y) { printf("error"); } }

  • 私はC言語を習い始めて5日の初心者です。

    私はC言語を習い始めて5日の初心者です。 下記のプログラムが動かないので優しく教えてください。 どうかお願いします。 #include <stdio.h> int main() { int ans1,ans; int total printf("コンビニ行くときは(1:車で 2:自転車で 3:歩いて)行く\n"); scanf("%d",&ans1); printf("1:汗かいた記憶がない 2:たまに汗かく 3:よく汗をかく\n"); scanf("%d",&ans2); total=ans1+ans2; if (total<4) { printf("運動不足です\n"); }else { printf("良く運動していますね\n"); } return(0); }

  • C言語

    #include <stdio.h> int main(void) { int a=0,ans1,ans2,ans3,ans4; printf("整数を入力してください。\n"); scanf("%d",a); ans1 = a+7; ans2 = a*;8 ans3 = a%3; ans4 = a*(-1); printf("%d\n",ans1); printf("%d\n",ans2); printf("%d\n",ans3); if(a==15){ prntf("true\n",a); } else{ printf("false\n",a); } if(a != 8){ printf("true\n",a); } else{ printf("false\n",a); } if(a <= 3){ printf("true\n",a); } else{ printf("false\n",a); } printf("%d\n",ans4); if(a<2||7<a){ printf("true\n",a); } else{ printf("false\n",a); } return 0; } これを実行しようとしてもexeファイルになりません。 教えていただけませんか?

  • C言語(初心者です

    C言語(超初心者です) 二重ループを中断する 2 通りの方法についてのソースコード を書きたいのですが 方法 1:フラグだけを使い,ジャンプを使わない. 方法 2:ジャンプだけを使い,フラグを使わない. #include <stdio.h> int main() { int f = 0; char *ans; printf("Loop {\n"); while ( ... ) { ... printf(" Loop {\n"); while ( ... ) { ... printf(" Break ? "); scanf("%s", ans); if (ans[0] == 'y') ... else if (ans[0] == 'q') ... ... } printf(" }\n"); } ... printf("}\n"); printf("Done.\n"); return (0); } 実行例: % ./a.out Loop { Loop { Break ? no Break ? no ... Break ? yes } Loop { Break ? no ... Break ? quit } } Done. % このソースコードをどう変えればいいのでしょうか 方法1のフラグを使って2重ループを脱出するっていうのどういうことかちょっとわからないです。 方法2ではbreakを使うのですか。 yesが入力されたら外にでる?みたいな感じでしょうか。

  • C言語でのfunctionを使い方を教えてください

    http://codepad.org/vyQ5fYTk web上のコンパイラを使ってベッセル関数の計算を行いたいのですが、 以下は、書籍からそのままコピーしてきたベッセル関数の計算です。 #include <math.h> float bessj0(float x) { float ax,z; double xx,y,ans,ans1,ans2; if ((ax=fabs(x)) < 8.0) { y=x*x; ans1=57568490574.0+y*(-13362590354.0+y*(651619640.7 +y*(-11214424.18+y*(77392.33017+y*(-184.9052456))))); ans2=57568490411.0+y*(1029532985.0+y*(9494680.718 +y*(59272.64853+y*(267.8532712+y*1.0)))); ans=ans1/ans2; } else { z=8.0/ax; y=z*z; xx=ax-0.785398164; ans1=1.0+y*(-0.1098628627e-2+y*(0.2734510407e-4 +y*(-0.2073370639e-5+y*0.2093887211e-6))); ans2 = -0.1562499995e-1+y*(0.1430488765e-3 +y*(-0.6911147651e-5+y*(0.7621095161e-6 -y*0.934945152e-7))); ans=sqrt(0.636619772/ax)*(cos(xx)*ans1-z*sin(xx)*ans2); } return ans; } printf(bessj0(5)) 最後にprintfを使って値を出力したいのですが、 どうしてもここで Line 28: error: expected constructor, destructor, or type conversion before '(' token compilation terminated due to -Wfatal-errors. というエラーが出てしまいます。 LanguageはC++に指定しましたが、うまくいかないのですが、 どのようにすれば良いでしょうか?

  • gccですが、コンパイルができません!

    以下のプログラムですが #include <stdio.h> int main() { Int col; char i; scanf( "%d", &col ); for( i = 0 ; i < 26 ; i++ ){ if( i > 0 && ( i % col ) == 0 ) printf( "\n" ); printf( "%c", 'a' + i ); } return 0; } 以上のプログラムをgccでコンパイルしました。 コンパイルするために入力した文字→  gcc p.c -o p.exe 以下のエラーがでてコンパイルできません。 p.c: In function `main': p.c:4: error: `Int' undeclared (first use in this function) p.c:4: error: (Each undeclared identifier is reported only once p.c:4: error: for each function it appears in.) p.c:4: error: syntax error before "col" p.c:7: error: `col' undeclared (first use in this function) p.c:17:2: warning: no newline at end of file  以上なぜコンパイルができないのですか? よろしくお願いいたします。

  • C言語

    forの直後で1+2+3+4+5+・・・・・・・と加算し続ける式がわからないので教えてください。 #include<stdio.h> int main(void) { char moji; int i,sum; printf("正の整数を1から順に加算します。n\"); printf("加算を開始してよろしいですか。(Y=実行。N=終了)\n"); moji=getchar(); if(moji==y) { for(i=2;sum>=1001;i++) { この部分がわかりません; printf("加算値は%dです。¥n",sum); } }else if(moji=='n'){ printf("終了します。\n"); }else{ printf("YまたはNを入力してください。\n"); } return 0; }

  • C言語で簡単暗号

    C言語を初めてけっこう立つんですが。 自分なりにソフトを作ってみました 暗号化、解読ができるソフトです 1.暗号化 2.解読 3.Quit ソースは #include <stdio.h> int main(void) { int i; char da; back: modo: do{ printf("1.angouka\n"); printf("2.kaidoku\n"); printf("3.Quit\n"); scanf("%d",&i); }while(i<1 || i>3); if(i==1){ da=getchar(); while(da){ printf("%c",da+1); da=getchar(); if(da=='.'){ goto modo; } } } else if(i==2){ da=getchar(); while(da){ printf("%c",da-1); da=getchar(); if(da=='.'){ goto back; } } } return 0; } なんですが。感想などここはこうした方が良いなどと教えてもらいたいんですが。 もっと簡潔にかけて破かれにくい暗号を書くにはどうしたらいいでしょう 教えて下さい