ページ 1 / 1
while文のループ脱出
Posted: 2009年6月08日(月) 16:54
by 研修生
while((c = getchar() != EOF){
switch(c){
case 'a':
(処理)
break;
case 'b':
c = getchar();
(処理)
break;
・
・
・
・
}
}
のようなプログラムがあるとき,case bのときに次の値をcに代入していますが
このときにcがEOFだった場合即座にwhileのループを抜ける方法を探しています。
教えて下さい。
Re:while文のループ脱出
Posted: 2009年6月08日(月) 17:02
by 研修生
break使えばいい事にきづきました。自己解決しました。
Re:while文のループ脱出
Posted: 2009年6月08日(月) 18:05
by 研修生
と思ったのですがこの場合switch文から抜けるだけでwhileは抜けません・・
switch文を抜けた後にさらに判定式を行なってbreakすればいけそうですが
どうも冗長のように思えます。他にいい方法ないでしょうか?
Re:while文のループ脱出
Posted: 2009年6月08日(月) 18:09
by yu
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 を使う方法もあります。
#一部編集しました。
Re:while文のループ脱出
Posted: 2009年6月08日(月) 21:20
by Dixq (管理人)
後、抜けたいループ部分を関数化してしまい、returnで抜けるという手もあるかもしれませんね。
Re:while文のループ脱出
Posted: 2009年6月08日(月) 21:56
by フリオ
こういうのはどうでしょう。
#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文を抜けた後にさらに判定式を行なって
と、かわらないかな。
Re:while文のループ脱出
Posted: 2009年6月09日(火) 09:18
by toyo
私は多重ループから一番外に抜けるときや複数の処理で共通のエラー処理をしたいときはgotoを使います
gotoを使えば簡単に書ける処理をgotoを避けるがためにフラグ変数を追加したり条件判定を追加したりするのは本末転倒な気がします
Re:while文のループ脱出
Posted: 2009年6月09日(火) 17:34
by sizuma
switchを使わないで、ifとelse ifで書けば、breakでwhileから抜けられるのでは?
とは言うものの、僕はifばっかり使うのはなんだか抵抗があるし、わざわざこれだけのために書き換える気にはならないですよね(笑
Re:while文のループ脱出
Posted: 2009年6月09日(火) 17:46
by やそ
Re:while文のループ脱出
Posted: 2009年6月10日(水) 13:32
by 研修生
ご意見ありがとうございます。
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での抜け出しが起こっているようですが調べてもさっぱりわかりません。
教えて下さい。
Re:while文のループ脱出
Posted: 2009年6月10日(水) 14:20
by Libra
自分の"経験"なので参考までに。
switch文の中でswitchを用いると、コンパイラが読み間違いを起こす時があるみたいです。
特にswitch(A)の中に同じswitch(A)があると起こりやすいようです。
ソースが同じなのにコンパイルするたびに、動作が意図したものと意図しないものになるという不定動作になりました。書いてる側は2個目のswitchを意図しているのに、1個目のswitchと混ざってしまった動作をしたことがあります。
この時にswitch文の中のswitchをif文に直したところ、意図した動作になったことがあります。
また、どうしてもswitchを使いたいときはその2個目のswitchでの処理を関数化して処理するようにしてます。
>>switch文の方がみやすいらしく
時と場合によると思います。
Re:while文のループ脱出
Posted: 2009年6月10日(水) 14:34
by Libra
if( c != '\n' )
{
putchar('aaaaa\n');
}
else{
putchar('a');
}
return
とかにソースを書き換えて、実際にプログラムがそこを通っているか確かめてみるのもいいかもしれません。