• ベストアンサー

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 )」と表示されるのですが何でですか? 困ってます↓

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

  • ベストアンサー
  • yama5140
  • ベストアンサー率54% (136/250)
回答No.6

・「プログラムの流れ・終了が、判らない」ですかね。  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 ); // プログラム終了 } 注:インデントに全角空白を用いています。コピペ後、タブに一括変換して下さい。

tomato1414
質問者

補足

そうなんですよ breakの位置は間違えたんじゃないんです; あれで正しいと思ってたんです。。 ただきちんとbreakを理解してなかったんですよね。。 しかも自分のプログラムに条件の重複があったのも気づきませんでしたしほんと関心しました。 さらにC言語のサイトまでありがとうございます! いろいろ助かりましたぁ^^ 何かあったときはまたよろしくお願いします!

その他の回答 (6)

noname#130082
noname#130082
回答No.7

>fprintf(,""); >と >stderr >の意味を教えていただけませんか?? fprintfはファイルへ出力する関数です。 stderr はエラー表示のための出力と思ってかまいませんので、エラー表示のための出力になります。printfだと標準出力(stdout)への出力となります。 stdoutとstderrはコマンドプロンプト上では同じコンソールへの出力となりますから、printfでやっても基本的にはかまわないのです。が、このプログラムの出力を別のプログラムの入力にしたい、などという場合(バッチファイルではパイプを使う場合など)を考えると、エラーメッセージと標準的な出力は分けた方が良い、とされています。 取り合えず、多分、質問者様のソースから「break;」を消せば、良し悪しは別としてコンパイルと実行は可能かと思います。

tomato1414
質問者

補足

まだ自分の知識が足りないのであまり理解できなかったです>< わざわざ答えてくださってありがとうございます。。

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.5

#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)が成立するだけです)

tomato1414
質問者

補足

ありがとうございます! すごいわかりやすかったです^ 助かりました。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

fprintf とか stderr くらい調べればいくらでも出てきそうな気がするんだけど.... どのくらい調べました?

tomato1414
質問者

補足

すいません。 全く調べてませんでした><

noname#130082
noname#130082
回答No.3

break;はいらないかと思います。 ifでn>0のみの場合にfor文などを実行してますから、nが0以下の場合は貴方の希望通りに何も実行されずに終了すると思います(確かめてませんが)。 n<=0の場合にメッセージなどを出したい場合は、elseでやるとか。 むしろ、 if( n <= 0 ){ fprintf(stderr,"n <= 0\n"); exit(1); } などとやった方が読みやすいかもしれないですけど。

tomato1414
質問者

補足

ありがとうございます↑ 質問なんですけど fprintf(,""); と stderr の意味を教えていただけませんか??

  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.2

break文は、for文やwhile文の括弧の内側でのみ使用可能です。括弧の外側では使用できません。 for(なにがしかの条件){ ・・・ここは使用可能 } ・・・ここでは使用できません。

tomato1414
質問者

補足

ありがとうございます! でも下でも書いたんですが、nが0以下のときプログラムを終了させたいんですよ; どうしたらいいでしょうか??

回答No.1

いや、だからbreakの位置がおかしいいってコンパイラが教えてくれてますって。 breakは、switchブロックやループから脱出するのに使用しますが…、 あたなのプログラムのbreakの位置を確認してみては? ループからすでに抜けた後に呼び出してるでしょ??

tomato1414
質問者

補足

そうですね; でもnが0以下のとき、プログラムを終了させたいんですよ↓ どうしたらいいでしょうか?↓

関連するQ&A