こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

投稿日時 - 2006-11-17 14:28:12

QNo.2545189

困ってます

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

> switch文ではなくif文による分岐を行うべきなのでしょうか?

switchによる分岐とifによる分岐は、相互に置き換えできます。
どちらかを使う「べき」ということはありません。

> breakを行うことで、whileの無限ループまで抜けることになるのでしょうか?

switch {} から抜けるだけです。
while文の無限ループから抜けるには、
・フラグ変数を使う
・goto文を使う
というような方法があります。

投稿日時 - 2006-11-17 15:07:53

補足

回答ありがとうございます。

case 5の処理は可能なのですが・・・ほかの処理ができない状態です。

switch文の中にif文をネストしているのは、あっているのでしょうか?

投稿日時 - 2006-11-17 15:21:01

お礼

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

ありがとうございました。

投稿日時 - 2006-11-17 22:21:10

このQ&Aは役に立ちましたか?

14人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

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

投稿日時 - 2006-11-17 16:18:12

補足

返信ありがとうございます。

#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から抜け出したいと考えています。

よろしくお願いします。

投稿日時 - 2006-11-17 21:25:50

お礼

すみません。

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

投稿日時 - 2006-11-17 22:19:14

ANo.2

caseの中にifを入れるのは問題ないです。

whileの中でlenを初期化(0を代入)していませんが、
これでよろしいのでしょうか?

 while(recv_Buf[len]!='\0')

の前に

 len=0;

を書いてみたらどうでしょうか?

投稿日時 - 2006-11-17 15:59:20

補足

返答ありがとうございます。

申し訳ありません、
int len = 0;
と初期化しています。

記述の不備で、申し訳ありませんでした。

投稿日時 - 2006-11-17 16:15:47

お礼

解決しました。
ありがとうございました。

今後ともよろしくお願いします。

投稿日時 - 2006-11-17 22:20:17

あなたにオススメの質問