• ベストアンサー

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;    } }

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

  • ベストアンサー
noname#22058
noname#22058
回答No.1

> switch文ではなくif文による分岐を行うべきなのでしょうか? switchによる分岐とifによる分岐は、相互に置き換えできます。 どちらかを使う「べき」ということはありません。 > breakを行うことで、whileの無限ループまで抜けることになるのでしょうか? switch {} から抜けるだけです。 while文の無限ループから抜けるには、 ・フラグ変数を使う ・goto文を使う というような方法があります。

bird0214
質問者

お礼

フラグ・・・というものが分かりました。 ありがとうございました。

bird0214
質問者

補足

回答ありがとうございます。 case 5の処理は可能なのですが・・・ほかの処理ができない状態です。 switch文の中にif文をネストしているのは、あっているのでしょうか?

その他の回答 (2)

noname#22058
noname#22058
回答No.3

あと、気になるのは、 lenが3, 5, 12~15のいずれでもない場合に どういう動きをするのが正しいのか?という点です。 何もしなくてよい場合は、 default: break; を明示的に書いておくのがよいでしょう。

bird0214
質問者

お礼

すみません。 解決しました。 bool型は用いず、int型で行いました。 ありがとうございました。

bird0214
質問者

補足

返信ありがとうございます。 #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)
回答No.2

caseの中にifを入れるのは問題ないです。 whileの中でlenを初期化(0を代入)していませんが、 これでよろしいのでしょうか?  while(recv_Buf[len]!='\0') の前に  len=0; を書いてみたらどうでしょうか?

bird0214
質問者

お礼

解決しました。 ありがとうございました。 今後ともよろしくお願いします。

bird0214
質問者

補足

返答ありがとうございます。 申し訳ありません、 int len = 0; と初期化しています。 記述の不備で、申し訳ありませんでした。

関連するQ&A