while文のループ脱出

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
研修生

while文のループ脱出

#1

投稿記事 by 研修生 » 16年前

while((c = getchar() != EOF){
   switch(c){
     case 'a':
         (処理)
         break;
     case 'b':
         c = getchar();
         (処理)
         break;
    ・
  ・
  ・
  ・
 }
}
のようなプログラムがあるとき,case bのときに次の値をcに代入していますが
このときにcがEOFだった場合即座にwhileのループを抜ける方法を探しています。
教えて下さい。

研修生

Re:while文のループ脱出

#2

投稿記事 by 研修生 » 16年前

break使えばいい事にきづきました。自己解決しました。

研修生

Re:while文のループ脱出

#3

投稿記事 by 研修生 » 16年前

と思ったのですがこの場合switch文から抜けるだけでwhileは抜けません・・
switch文を抜けた後にさらに判定式を行なってbreakすればいけそうですが
どうも冗長のように思えます。他にいい方法ないでしょうか?

yu

Re:while文のループ脱出

#4

投稿記事 by yu » 16年前

int flag = 0;

while((c = getchar())!= EOF){
   switch(c){
     case 'a':
         (処理)
         break;
     case 'b':
         if((c = getchar()) != EOF){
           (処理)
         }
         else
           flag = 1;
         break;
    ・
  ・
  ・
  ・
 }
  if(flag == 1)
    break;
}

とするのはだめですか?

他に goto を使う方法もあります。

#一部編集しました。

Dixq (管理人)

Re:while文のループ脱出

#5

投稿記事 by Dixq (管理人) » 16年前

後、抜けたいループ部分を関数化してしまい、returnで抜けるという手もあるかもしれませんね。

フリオ

Re:while文のループ脱出

#6

投稿記事 by フリオ » 16年前

 
 こういうのはどうでしょう。

#include <stdio.h>

int main(void)
{
	int c;
	
	do{
		switch(c = getchar()){
			case 'a': puts("a"); break;
			case 'b':
				if((c = getchar()) == EOF) break;
				puts("b");
				break;
			case 'c': puts("c"); break;
			case EOF: break;
			default : puts("default"); break;
		}
	}while(c != EOF);
	return 0;
}
 
> switch文を抜けた後にさらに判定式を行なって
と、かわらないかな。
 

toyo

Re:while文のループ脱出

#7

投稿記事 by toyo » 16年前

私は多重ループから一番外に抜けるときや複数の処理で共通のエラー処理をしたいときはgotoを使います
gotoを使えば簡単に書ける処理をgotoを避けるがためにフラグ変数を追加したり条件判定を追加したりするのは本末転倒な気がします

sizuma

Re:while文のループ脱出

#8

投稿記事 by sizuma » 16年前

switchを使わないで、ifとelse ifで書けば、breakでwhileから抜けられるのでは?
とは言うものの、僕はifばっかり使うのはなんだか抵抗があるし、わざわざこれだけのために書き換える気にはならないですよね(笑


研修生

Re:while文のループ脱出

#10

投稿記事 by 研修生 » 16年前

ご意見ありがとうございます。
if-elseにすれば抜けれますがswitch文の方がみやすいらしくそちらを使用しなければなりません。
goto文を使おうと色々やってますが
while((c = getchar() != EOF){
   switch(c){
     case 'a':
         (処理)
         break;
     case 'b':
         c = getchar();
         switch(c){
           case EOF:
             goto err;
          ・
          ・
          ・
          ・
          default:
            (処理)
           break;
        }
    ・
  ・
  ・
  ・
 }
}

err:
   if(c != '\n'){
       putchar('\n');
   }

   return 0;
}
のような感じでgoto文を使うとgotoの所の次が
[pre]
err:
   if(c != '\n'){
       putchar('\n');
   }

   return 0;
}
のerrの部分ではなくreturnに飛ぶのですが・・
gotoでの抜け出しが起こっているようですが調べてもさっぱりわかりません。
教えて下さい。

Libra

Re:while文のループ脱出

#11

投稿記事 by Libra » 16年前

自分の"経験"なので参考までに。
switch文の中でswitchを用いると、コンパイラが読み間違いを起こす時があるみたいです。
特にswitch(A)の中に同じswitch(A)があると起こりやすいようです。

ソースが同じなのにコンパイルするたびに、動作が意図したものと意図しないものになるという不定動作になりました。書いてる側は2個目のswitchを意図しているのに、1個目のswitchと混ざってしまった動作をしたことがあります。

この時にswitch文の中のswitchをif文に直したところ、意図した動作になったことがあります。
また、どうしてもswitchを使いたいときはその2個目のswitchでの処理を関数化して処理するようにしてます。


>>switch文の方がみやすいらしく
時と場合によると思います。

Libra

Re:while文のループ脱出

#12

投稿記事 by Libra » 16年前

if( c != '\n' )
{
	putchar('aaaaa\n');
}
else{
	putchar('a');
}
return
とかにソースを書き換えて、実際にプログラムがそこを通っているか確かめてみるのもいいかもしれません。

閉鎖

“C言語何でも質問掲示板” へ戻る