- ベストアンサー
swith文について
こんにちは。 switch文を用いて分岐を行っています。 以下のプログラムは、whileの無限ループ内にswitch文の分岐を行っています。while内にrecvfrom関数(ソケット通信用関数)を用いています。recv_Buf配列内をヌル文字まで走査し、文字列の長さによって分岐をしています。 while内のrecvfromによって、他端末から文字列を逐次受信しているのですが、この場合、switch文ではなくif文による分岐を行うべきなのでしょうか? また、breakを行うことで、whileの無限ループまで抜けることになるのでしょうか? switchの場合、breakを用いないと、実行したくないところまで実行してしまう可能性があるので、breakは必要だと思い以下のプログラムにしました。 よろしくお願いいたします。 [プログラム] while(1){ recvfrom(s2, recv_Buf, (int)sizeof(recv_Buf) - 1, 0, (SOCKADDR *)&from, &fromlen); while(recv_Buf[len]!='\0') len++; switch(len){ case 3: if(memcmp(recv_Buf,"END",3) == 0){ //処理 } break; case 5: if(memcmp(recv_Buf,"START",5) == 0){ //処理 } break; case 12: case 13: case 14: case 15: if(memcmp(recv_Buf,"SEND_PACKET",11) == 0){ //処理 } break; } }
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
> switch文ではなくif文による分岐を行うべきなのでしょうか? switchによる分岐とifによる分岐は、相互に置き換えできます。 どちらかを使う「べき」ということはありません。 > breakを行うことで、whileの無限ループまで抜けることになるのでしょうか? switch {} から抜けるだけです。 while文の無限ループから抜けるには、 ・フラグ変数を使う ・goto文を使う というような方法があります。
その他の回答 (2)
あと、気になるのは、 lenが3, 5, 12~15のいずれでもない場合に どういう動きをするのが正しいのか?という点です。 何もしなくてよい場合は、 default: break; を明示的に書いておくのがよいでしょう。
お礼
すみません。 解決しました。 bool型は用いず、int型で行いました。 ありがとうございました。
補足
返信ありがとうございます。 #1の方にご指摘を受けたのですが、確かにwhileループが無限ループであるため抜けることができません。フラグ・・・?を使用して抜けることが考えられるとのことですが・・・ bool型(C++にはありますがCにはないようです)を使用すればよいのでしょうか?実際に、while(1)ではなく、 bool flags = false; do{ switch(len){ case 3: if(flags == false){ flags = true; } break; case 5: break; case 12: break; case 13: break; case 14: break; case 15: break; } }while(flags == true); と記述したのですが、うまくいきません・・・。 case 3が実行されるとswitchおよびwhileから抜け出したいと考えています。 よろしくお願いします。
- redasurc
- ベストアンサー率37% (3/8)
caseの中にifを入れるのは問題ないです。 whileの中でlenを初期化(0を代入)していませんが、 これでよろしいのでしょうか? while(recv_Buf[len]!='\0') の前に len=0; を書いてみたらどうでしょうか?
お礼
解決しました。 ありがとうございました。 今後ともよろしくお願いします。
補足
返答ありがとうございます。 申し訳ありません、 int len = 0; と初期化しています。 記述の不備で、申し訳ありませんでした。
お礼
フラグ・・・というものが分かりました。 ありがとうございました。
補足
回答ありがとうございます。 case 5の処理は可能なのですが・・・ほかの処理ができない状態です。 switch文の中にif文をネストしているのは、あっているのでしょうか?