- ベストアンサー
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 )」と表示されるのですが何でですか? 困ってます↓
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
・「プログラムの流れ・終了が、判らない」ですかね。 if, for 文など、基本的な部分を勉強してみては如何でしょう。 なお、末尾の return 0; は、「プログラム終了」の命令です。 質問者様が break; を入れた場所は、ここを「nが0以下のとき『は』通過する」と 理解できていたから、ですよね。 ☆となると、「プログラム終了直前に、なにを(どこへ)ブレイクさせればいいんだ」となりませんか。 http://www.kumei.ne.jp/c_lang/ >これをコンパイルすると「break の位置が誤っている(関数 main )」と表示されるのですが何でですか? No.2 さんのとおり、 質問者様の break; が、エラー(誤った使い方)だからです。 >でもnが0以下のとき、プログラムを終了させたいんですよ if 文を勉強すると、「nが0以下のとき」を簡単に記述できるようになります。 今回のように「nが0を超えるとき」の if 文があるなら、 ちょうど反対の条件なので、else 文で簡略化できます。 今回の break; は、少なくとも else break; とすれば、それでも誤った使い方ですが、 少しは救い?があったかと・・。 というか、 「なにもしないで」終了ですよね。でしたら、なんの「命令」も不要です。 冒頭で述べた、末尾の return 0; は、「プログラム終了」の命令です。 ここへ、「nが0以下のとき」は、直行します(◆)。 +++++++++++++++++++++++++++++++++++++++++++++++++++ 蛇足 質問者様のソースで、 >if(n>0){ >for(i=1;i<=n;i++){ と >if(i-1>0){ >for(k=i-1;k>0;k--){ について、if 文と for 文の条件式とが、機能的に重複( if 文不要)しています。 以下に、その部分を整理してみました( n → iVal )。 0 や負の数で試してください。 #include <stdio.h> int main( void ) { int iVal, i, j, k; printf( "正の整数:" ); scanf( "%d", &iVal ); for( i = 1; i <= iVal; i++ ){ // ◆ iVal が 0 以下のとき、当 for 構文スルー printf( "%2d", i ); for( j = 1; j <= ( iVal + 1 - i ); j++ ){ if( 1 == j ){ for( k = ( i - 1 ); k > 0; k-- ) printf( " " ); } printf( "*" ); } printf( "\n" ); } return( 0 ); // プログラム終了 } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。
その他の回答 (6)
>fprintf(,""); >と >stderr >の意味を教えていただけませんか?? fprintfはファイルへ出力する関数です。 stderr はエラー表示のための出力と思ってかまいませんので、エラー表示のための出力になります。printfだと標準出力(stdout)への出力となります。 stdoutとstderrはコマンドプロンプト上では同じコンソールへの出力となりますから、printfでやっても基本的にはかまわないのです。が、このプログラムの出力を別のプログラムの入力にしたい、などという場合(バッチファイルではパイプを使う場合など)を考えると、エラーメッセージと標準的な出力は分けた方が良い、とされています。 取り合えず、多分、質問者様のソースから「break;」を消せば、良し悪しは別としてコンパイルと実行は可能かと思います。
補足
まだ自分の知識が足りないのであまり理解できなかったです>< わざわざ答えてくださってありがとうございます。。
- tatsu99
- ベストアンサー率52% (391/751)
#2です。 >ありがとうございます! >でも下でも書いたんですが、nが0以下のときプログラムを終了させたいんですよ; >どうしたらいいでしょうか?? printf("正の整数:"); scanf("%d",&n); の次の行へ if (n<=0) return 0; を入れて下さい。 これで、nが0以下の時は、そこで終了します。 ですから、 if (n<=0) return 0; の次の行は、 nが1以上であることを前提にしたコーディングをすれば良いです。 つまり if(n>0)の文は、不要です。(あってもエラーにはなりません。必ずif(n>0)が成立するだけです)
補足
ありがとうございます! すごいわかりやすかったです^ 助かりました。
- Tacosan
- ベストアンサー率23% (3656/15482)
fprintf とか stderr くらい調べればいくらでも出てきそうな気がするんだけど.... どのくらい調べました?
補足
すいません。 全く調べてませんでした><
break;はいらないかと思います。 ifでn>0のみの場合にfor文などを実行してますから、nが0以下の場合は貴方の希望通りに何も実行されずに終了すると思います(確かめてませんが)。 n<=0の場合にメッセージなどを出したい場合は、elseでやるとか。 むしろ、 if( n <= 0 ){ fprintf(stderr,"n <= 0\n"); exit(1); } などとやった方が読みやすいかもしれないですけど。
補足
ありがとうございます↑ 質問なんですけど fprintf(,""); と stderr の意味を教えていただけませんか??
- tatsu99
- ベストアンサー率52% (391/751)
break文は、for文やwhile文の括弧の内側でのみ使用可能です。括弧の外側では使用できません。 for(なにがしかの条件){ ・・・ここは使用可能 } ・・・ここでは使用できません。
補足
ありがとうございます! でも下でも書いたんですが、nが0以下のときプログラムを終了させたいんですよ; どうしたらいいでしょうか??
- sonata1229
- ベストアンサー率36% (76/206)
いや、だからbreakの位置がおかしいいってコンパイラが教えてくれてますって。 breakは、switchブロックやループから脱出するのに使用しますが…、 あたなのプログラムのbreakの位置を確認してみては? ループからすでに抜けた後に呼び出してるでしょ??
補足
そうですね; でもnが0以下のとき、プログラムを終了させたいんですよ↓ どうしたらいいでしょうか?↓
補足
そうなんですよ breakの位置は間違えたんじゃないんです; あれで正しいと思ってたんです。。 ただきちんとbreakを理解してなかったんですよね。。 しかも自分のプログラムに条件の重複があったのも気づきませんでしたしほんと関心しました。 さらにC言語のサイトまでありがとうございます! いろいろ助かりましたぁ^^ 何かあったときはまたよろしくお願いします!