• ベストアンサー

コンパイルすると『breakの位置が誤っている』『elseの位置が誤っている』となるのは何故?

C言語初心者です。 テキストを真似たつもりで自作してみましたが、コンパイルすると下記のようにエラーが出ます。 エラー E2030 hello.cpp 11: break の位置が誤っている(関数 main() ) エラー E2054 hello.cpp 12: else の位置が誤っている(関数 main() ) エラー E2030 hello.cpp 14: break の位置が誤っている(関数 main() ) 特に問題はないように思うのですが。何故でしょうか? 解説宜しくお願いします。 #include <stdio.h> int main(void) { int a; a = getchar(); if(a == 9) printf("入力値は%dです。\n",a); break; else printf("入力値は9ではなく %dです。\n",a); break; }

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

  • ベストアンサー
noname#77845
noname#77845
回答No.1

if文は、 if(a==9){  printf("入力値は9です。\n"); } else {  printf("入力値は9ではなく%dです。\n",a); } のようになります。「break」はいりません。因みに、真の場合のprintf文では、"a"を出力させる必要もありません。a==9だからです。 また、こういう書き方も有りかなと… printf("入力値は9"); if(a==9){  printf("です。\n"); } else {  printf("ではなく%dです。\n",a); }

C-baby
質問者

お礼

回答有難うございました。 a=getchar(); を scanf("%d",&a); に変更したところ 入力値が大きすぎなければ、正しい答えを返すようになりました。 やはり、問題点は { } の欠落のためだったようです。 有難うございました。

C-baby
質問者

補足

早速の回答ありがとうございます。 break; および a を削除しコンパイルしてみました。 結果は 10を入力した時、下記のような結果になってしまいました。 入力値は9ではなく 49です。なぜ、49になってしまうのでしょうか? 再びご回答宜しくお願い致します。 #include <stdio.h> int main(void) { int a; a = getchar(); if(a == 9){ printf("入力値は9です。\n"); }else{ printf("入力値は9ではなく %dです。\n",a); } }

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • imopro
  • ベストアンサー率35% (58/163)
回答No.5

getchar()は一文字だけ読み込むので,"10"の一文字目の"1"を出力したんだと思います.もし,2文字以上の数字も扱いたいなら,以下のようにscanfを使えばいいでしょう.今度はaを数値として扱う為,int型にしました. ---- #include <stdio.h> int main(void){ int a; scanf("%d",&a); if(a == 9){ printf("入力値は%dです。\n",a); }else{ printf("入力値は9ではなく %dです。\n",a); } }

C-baby
質問者

お礼

回答有難うございました。 私もあとから気がつき、テキストで確認しました。 お手数をおかけいたしました。 なお、今回の質問はNo.1さんのところに書き込んだように、{ }をつけたし、scanf("%d",&a);に直したところ、意図した結果が出ましたので質問を締め切りたいと思います。 どうも皆様、有難うございました。

全文を見る
すると、全ての回答が全文表示されます。
  • imopro
  • ベストアンサー率35% (58/163)
回答No.4

同じくC言語初心者です. break文は,それを含んでいる最も内側のfor文,while文,do-while文,switch文をその時点で中断するものです.if文単体では使えないのでは?(ちょっと自身はないですが) 以下に正常に動くものを書いてみました. 主な変更点はaをchar型で宣言するところです. ---- #include <stdio.h> int main(void){ char a; a = getchar(); if(a == '9'){ printf("入力値は%cです。\n",a); }else{ printf("入力値は9ではなく %cです。\n",a); } }

C-baby
質問者

お礼

回答有難うございました。 上記追加項目について getcharは半角文字一文字分しか処理しないんでしたね。 その辺の理解が不十分でした。済みません。

C-baby
質問者

補足

回答有難うございます。早速、プログラムをコピペしてコンパイルしてみましたが、 10 を入力した結果、 入力値は9ではなく 1です。 と出ました。 コンパイルの不良でしょうか?

全文を見る
すると、全ての回答が全文表示されます。
  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.3

if文には、1つの文または1つのブロックが続きます。 ブロックとは、1つ以上の文の前後を{ と }で囲ったものです。

全文を見る
すると、全ての回答が全文表示されます。
  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

if(a == 9) に括弧が無い。 if(a == 9){   printf("入力値は%dです。\n",a);   break; else   printf("入力値は9ではなく %dです。\n",a);   break; } でしょ?

C-baby
質問者

補足

回答有難うございます。 早速{ }をつけてコンパイルしてみましたが、結果は・・・ エラー E2030 hello.cpp 11: break の位置が誤っている(関数 main() ) エラー E2054 hello.cpp 12: else の位置が誤っている(関数 main() ) エラー E2030 hello.cpp 14: break の位置が誤っている(関数 main() ) となってしまいました。 #include <stdio.h> int main(void) { int a; a = getchar(); if(a == 9){ printf("入力値は%dです。\n"); break; else printf("入力値は9ではなく %dです。\n",a); break; } }

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C言語 エラー表示 break の位置が誤っている(関数 main ) 

    #include<stdio.h> int main(void){ int n,i,j,k; char c='*'; printf("正の整数:"); scanf("%d",&n); if(n>0){ for(i=1;i<=n;i++){ printf("%d",i); for(j=1;j<=n+1-i;j++){ if(j==1){ if(i-1>0){ for(k=i-1;k>0;k--){ printf(" "); } } } printf("%c",c); } printf("\n"); } } break; return 0; } これをコンパイルすると「break の位置が誤っている(関数 main )」と表示されるのですが何でですか? 困ってます↓

  • continueとbreakの位置

    「address2.txt」に登録してあるアドレスを検索するプログラムなのですが、アドレスが検索されない時に再度検索できるように付け足したのですが、「continueとbreakの位置が誤っている」と表示されます。どう訂正すればうまくいくのでしょうか? #define FNAME "address2.txt" #define RECORDLEN 16 #include <stdio.h> #include <stdlib.h> #include <string.h> char *format = "%-15s\n"; int main() { FILE *fp; char search[16], address[16],ans[8]; int no = 0, find = 0; fp = fopen(FNAME, "r+"); if(fp==NULL){ perror("ファイルエラー\n"); return -1; } printf("アドレスの入力-- "); gets(search); while (1) { fseek(fp, RECORDLEN * no++, SEEK_SET); if (fscanf(fp, "%s", address) == EOF) break; if (strstr(address, search) != NULL) { find++; printf("アドレス: %s\n", address); } } if(find>=1){ printf("アドレスが一致しました。" ); } else { printf("アドレスが一致しません。\n"); printf("再度検索し直しますか?(Y/N)\n"); gets(ans); if(ans[0]=='y'||ans[0]=='Y') continue; else break; } fclose(fp); return 0; }

  • コンパイルエラー

    Borlnd C++ compilerでコンパイルしたのですが、どうしてもエラーがでてしまいます。エラーは、不正な文字’’(0×8140)(関数 main) エラーE2206 文字' ' (0×8140)(関数 main) エラーE2206と二つ同じエラーがあると表示されます。本当に分からないので力を貸したください。お願いします。 /*読み込んだ二つの整数値の大きい方の値を求めて表示(条件演算子)*/ #include <stdio.h> int main(void) { int n1, n2, max; puts("二つの整数を入力してください。");   printf("整数1 : "); scanf("%d", &n1); printf("整数2 : "); scanf("%d", &n2); max = (n1 > n2) ? n1 : n2; printf("大きい方の値は%dです。\n", max); return 0;

  • 分割コンパイルについて

    現在分割コンパイルが分からずに苦戦しています。 下記のリストは構造体を使わなければコンパイラを通すことができましたが、 使うとなぜか通りません。 あれこれ試しましたがどうしても分かりません。 何がおかしいのでしょうか? *define.hで全てのファイルへの定義や宣言を行わせています。 ////////////// //Main.cpp ////////////// #include <stdio.h> #include <conio.h> #include "define.h" int main( void ){ Tmp[0].c = 15; printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); aaa(); bbb(); getch(); return 0; } ////////////////// // A.cpp ///////////////// #include <stdio.h> #include "define.h" void aaa( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // B.cpp ///////////////// #include <stdio.h> #include "define.h" void bbb( void ){ printf("a: %d\n", a); printf("b: %d\n", b); printf("c: %d\n", Tmp[0].c); printf("NUM:%d\n", NUM); } ////////////////// // define.cpp ///////////////// #include "define.h" int a = 10; int b = 20; struct Parameter { int c; }; struct Parameter Tmp[NUM]; ////////////////// // define.h ///////////////// #define NUM 100 extern int a; extern int b; extern struct Parameter Tmp[NUM]; void aaa( void ); void bbb( void );

  • if~else文の中にまたif~else文をいれるには。

     このプログラムを思うように実行したいのですが、できません。 コンパイルはできるのですが、警告が4つほど出て、結果も自分が思ってるのとは違います。 プログラムのどこを改善すべきか教えてください。 OSはWindows XPで、コンパイラはボーランドのフリーコンパイラを使用しています。 #include<stdio.h> int main(){ int a,b,c,d; printf("1か0を入力してください。\n"); scanf("%d",&a); if(a=0) { printf("2か3を入力してください。\n"); scanf("%d",&b); if(b=2){ printf("今まで合計は%dです。\n",a+b); } if(b=3){ printf("今まで合計は%dです。\n",a+b); } else { printf("指定した数字を入力して下さい。\n"); } } else if(a=1) { printf("あなたは%dを入力しました。\n",a); } else { printf("指定した数字を入力してください。\n"); } return 0; }

  • C++のコンパイルエラーが

    おこります。 --------------------------------- #include <stdio.h> int main(void) { printf("hello, world\n"); return 0; } -------------------------------------- をコンパイルするのですができません。 以下のエラーが出ます。 --------------------------------------- エラー E2209 sample.c 1: インクルードファイル 'stdio.h' をオープンできない 警告 W8065 sample.c 5: プロトタイプ宣言のない関数 'printf' の呼び出し(関数 main ) *** 1 errors in Compile *** -------------------------------------

  • C言語 どこがコンパイルエラーか解りません。

    いつも大変お世話になっております。 標記の件。 どこがエラーなのか解りません。 2時間くらい、にらめっこが続いています。 どこがエラーなのか教えて下さい。 ご回答のほどよろしくお願い申し上げます。 コード #include <stdio.h> int a = 0; void func(void) { int c = 2; printf("func関数では変数aとcが使えます。¥n”); printf("変数aの値は%dです。\n",a); /*printf("変数bの値は%dです。\n",b);*/ printf("変数cの値は%dです。\n",c); } int main(void) { int b = 1; printf("main関数では変数aとbが使えます。\n"); printf("変数aの値は%dです。\n", a); printf("変数bの値は%dです。\n", b); /*printf("変数cの値は%dです。\n", c); */ func(); return 0; } コンパイルエラー printf("func関数では変数aとcが使えます。¥n”); ^ text10.c:9:8: error: missing terminating " character printf("func関数では変数aとcが使えます。¥n”); ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ text10.c:10:34: error: expected ')' before ';' token printf("変数aの値は%dです。\n",a); ^ text10.c:10:1: warning: passing argument 1 of 'printf' makes pointer from integer without a cast [-Wint-conversion] printf("変数aの値は%dです。\n",a); ^~~~~~ In file included from text10.c:1:0: c:\mingw\include\stdio.h:454:38: note: expected 'const char *' but argument is of type 'int' _CRTIMP __cdecl __MINGW_NOTHROW int printf (const char *, ...); ^~~~~~ text10.c:13:1: error: expected ';' before '}' token } どうかよろしくお願いいたします。

  • 素数判定の繰返し

    繰返し素数判定を行ない、CtrlーDで終了するプログラムをつくっています。 まず繰返しなしの素数判定プログラムを作り #include<stdio.h> int main(void) { int a,i; printf("自然数を入力:"); scanf("%d",&a); if(a<=0) printf("入力エラーです。\n"); else if(a==1) printf("1は素数ではない。\n"); else{ for(i=2; i*i<=a; i++){ if(a%i==0) break; } if(i*i>a) printf("%dは素数です。\n",a); else printf("%dは素数ではない。\n",a); } return(0); } これはちゃんとできたのですがそれを繰り返すことができません。 #include<stdio.h> int main(void) { int a,i; printf("自然数を入力:"); scanf("%d",&a); while((a=getchar())!=EOF){ if(a<=0) printf("入力エラーです。\n"); else if(a==1) printf("1は素数ではない。\n"); else{ for(i=2; i*i<=a; i++){ if(a%i==0) break; } if(i*i>a) printf("%dは素数です。\n",a); else printf("%dは素数ではない。\n",a); } printf("自然数を入力:"); scanf("%d",&a); } printf("プログラムを終了します。\n"); return(0); } これは訳わからないことになっちゃいます。。。 どうしたらいいんでしょうか??

  • scanf関数のプログラムをgetchar関数で

    scanf関数を使って四則演算、論理輪、論理積をint、float、double型で表示するプログラムを作ったのですが これをscanf関数ではなく、getchar関数で組みなおし、関数化する課題が出ました。 そのままscanf関数のところだけを変えても型が違うというエラーが出てうまくいきません。 どうすればいいでしょうか? 一応scanf関数で組んだプログラムの一部を載せておきます。 #include <stdio.h> #include <math.h> main() { float a , b; float x[5]; printf("正の数字を2つ入力して下さい(小数点を含めて4ケタまで):\n"); for(;;) { printf("\na="); scanf("%f" , &a); if(a>=0 && a<=9999 && a) { break; } else { printf("****aに入力エラー****\n"); printf("数字は4ケタ以内の正数を入力:\n"); continue; } } for(;;) { printf("b="); scanf("%f" , &b); if(b>=0 && b<=9999 && b) { break; } else { printf("****bに入力エラー****\n"); printf("数字は4ケタ以内の正数を入力:\n"); continue; } } x[0] = a+b; x[1] = a-b; x[2] = a*b; x[3] = a/b; x[4] = a||b; x[5] = a&&b; printf("\n"); printf("int型 結果:\n足し算=%d\n" , (int)x[0]); printf("引き算=%d\n" , (int)x[1]); printf("掛け算=%d\n" , (int)x[2]); printf("割り算=%d\n" , (int)x[3]); printf("論理和=%d\n" , (int)x[4]); printf("論理積=%d\n" , (int)x[5]); printf("\n"); printf("float型 結果:\n足し算=%f\n" , x[0]); printf("引き算=%f\n" , x[1]); printf("掛け算=%f\n" , x[2]); printf("割り算=%f\n" , x[3]); printf("論理和=%f\n" , x[4]); printf("論理積=%f\n" , x[5]); ・ ・ ・ getchar(); }

  • 銀行のATMを想定したプログラム

    銀行のATMを想定したプログラム だいたい出来上がったのですが、 error C2143: 構文エラー : ';' が '型' の前にありません。 と出るのですがよくわかりません。 どこが違うのか指摘お願いします。 #include<stdio.h> void gamen();//メニュー画面を表示するユーザ関数をつくる。 int syori(int);//番号を入力した場合の処理はユーザ関数で作り、main関数から呼び出す。 int zandaka; int main(void) { int no,zandaka=100; printf("いらっしゃいませ\n"); do{ gamen(); scanf("%d",&no); int syori(int no); }while(no!=4); return 0; } void gamen() { printf("ご希望のメニューを入力してください\n" "1、お預け入れ\n" "2、残高照会\n" "3、おひきだし\n" "4、終了\n"); } int syori(int no) { int nuwkin,orosu; switch (no){ case 1:printf("お預入れ>"); scanf("%d",&nuwkin); zandaka=zandaka+nuwkin; printf("残高は%d円になります\n\n",zandaka); break; case 2:printf("残高は%d円です\n\n",zandaka); break; case 3:printf("おひきだし額は>"); scanf("%d",&orosu); if(orosu>zandaka){ printf("おひきだし額限度額は%dです" "残高不足なので引き出せません",zandaka); } else { if (zandaka>orosu){ zandaka=zandaka-orosu; printf("残高は%d円になりました",zandaka); } } break; case 4:printf("ありがとうございました\n\n"); break; default:("もう一度ご希望のメニューを入力\n"); } }