プロが教えるわが家の防犯対策術!

switch文の、switch(a)←このaの部分について分からない事があります。
例)
void WRITE(void){
char str;
fgets(str,8,stdin);
puts(str);
swicth(str){
case ??:実行文1;break;
case ??:実行文2;break;
・ ↑
   ・
   default:break;
}
}
としたとき、矢印の「??」の部分には文字列を指定することが可能でしょうか?
例えば、「RX」が入力されたら実行文1、「TX」が入力されたら実行文2・・・というようにしたいのですが、どう指定したらいいのかがわかりません。一文字だけなら「''」で囲むのはわかるのですが、文字列となると・・・
どなたかご教授願えませんでしょうか?

A 回答 (8件)

取り合えず、C言語という仮定の元で。


あと、「#include <stdio.h>」(あるいは他の入出力関係の十分な情報を含むヘッダーファイル)も必要です。これがないと、stdinの意味が分からないよーとコンパイラに叱られます(^^;。

文字と文字列の区別をする、のがC言語理解の高いハードルの一つです。今、そのハードルを越えようとしているわけです。

文字そのものはコンピュータは認識しないので、文字に文字コードという数を割り当てて、その数をコンピュータが処理します。
char型はその文字を表す整数を表す型ですから、実際は整数の一種です。
一方、文字列は、char型の配列です。「文字」はchar型で「文字列」はchar型の配列です。
さらに、文字列というのは、どこかで終わらなければいけないので、「ここで文字列は終わりだよ」ということを表すために、追加で0という文字コードを入れることになっています(だから、文字列を表すためには、0を最後に追加するため、1文字多く配列の大きさを取らないといけません・・・だから「1文字の文字列」を表すためには長さ2の配列が必要になります)。ちなみに、ソースに0と書くと、数としての0か文字コードとしての0かが読みにくいので、文字コードとしての0は'\0'と書く方がよいです。

で、貴方のソースの fgets では長さ8と書かれています(実際に読み込まれる文字数は半角で7文字以下になります)ので、strの長さも8以上にしなければいけません(8はちょっと小さすぎるように思いますが)。実は、改行の扱いとかfgetsが失敗した場合にどうするか、などいろいろ考えなければいけないこともあるのですが省略します。

あと、
>fgets, puts がうまく作動しないと
と書きましたが、書き方が悪かったです。質問者様のソースだと、多分、C言語コンパイラでは、最低でも型がおかしいと警告されるはずですし、C++コンパイラでは型チェックが厳しくなっているのでコンパイルエラーになると思います。もっとも、警告だけでコンパイル可能だった場合も、実行すると暴走しますけど(^^;
    • good
    • 0

No.1です



>strcmpとはどういった働きをするものなのでしょうか?

文字列の比較をする関数です。
2つの文字列が一致していれば0を返します。
strcmp(s1, s2)
として
s1が辞書順でs2より前なら負、後なら正を返します

http://www9.plala.or.jp/sgwr-t/lib/strcmp.html
    • good
    • 0
この回答へのお礼

再度ありがとうございます。

>2つの文字列が一致していれば0を返します。
だから(strcmp(s,"xxx")==0)で、0とイコールになっていたのですね。
調べた時「==0」を見落としていたのでわからなくなっていました;
よくみたらすぐわかることでしたね・・・わざわざすみません・・・
丁寧に教えていただいて、ありがとうございます。

お礼日時:2009/05/16 19:55

char str;


だと、strはchar型になってしまうので、fgets, puts がうまく作動しないと思います。
char str[適当なサイズ];
とした方がよいと思います。
switch(str)はstrがchar型なら、charも整数として扱われるので、偶然にその部分だけは文法に合ってますが、そもそもstrには文字列を入れたいわけですから、没ですね。結局はif文でやるしかないです。
    • good
    • 0
この回答へのお礼

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

初めに、[xx]で文字数を指定しておいた方がいい、という解釈でよいのでしょうか。一文字ではなく、文字列をいれるのだ、と定義しておく、ということでしょうか・・

文字列でやるには、やはりifでやるしかないのですね・・・
とても参考になりました。ありがとうございます。

お礼日時:2009/05/16 19:50

ANo.2です。



> 比較に==が使われていればどんなに便利でしょう?

指摘されましたか。
アップした後でしまった、と思っていました。すみません。
どこにも == なんて書いていませんよね。

整数のみということでした。

失礼しました。
    • good
    • 0

>strcmpとはどういった働きをするものなのでしょうか?



標準関数ですので、まずはご自分で調べてみてください。
    • good
    • 0
この回答へのお礼

すみません、調べてみました。
が、いまいちよくわからなっかたもので・・・

お礼日時:2009/05/16 19:45

No.1です。


ちょっと補足させてください。

switch ~ caseの実装方法は特に規定されておりません。
私は、hash + 関数ジャンプの実装を見かけたことがあります。

比較に==が使われていればどんなに便利でしょう?
STLのように==演算子をオーバーロードさえすれば、
整数に限らず、どんな型でもcaseにおけるのですから

しかし、現状はそうなっていません。
整数に限定することで、より高速な分岐を実装できるからです。

   
    • good
    • 0

VC++のオンラインマニュアルより



> switch expression と case constant-expression には
> 整数型を指定する必要があります。

つまり比較は == が使われているということですので、
文字列はNGです。
    • good
    • 0
この回答へのお礼

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

わたしが使っているものがc++なのかどうかは分からないのですが、とりあえず出来なさそうということがわかりました。
マニュアルを持ってきていただいて、ありがとうございます。

お礼日時:2009/05/16 18:11

caseに指定できるのは"整数型"のみです。


文字の場合は、文字コードが整数なので指定できるのです。

同様の理由で浮動小数点もだめです

case 0.5

なんてのも許されません。
if文で代用しましょう。

   if (strcmp(s, "ABC) == 0)
{
}
else if (strcmp(s, "DEF") == 0)
{
}
else
{
}

のように記述することで
switchと(見た目的に)似たような形のコーディングができます。
"ABC"の場合、"DEF"の場合、 それ以外
で処理が分かれていることが
はっきりわかります。

この回答への補足

あと、申し訳ないのですが、一つお聞きしてよいでしょうか?
回答中に使われている

strcmp(s,"xxx")

の、strcmpとはどういった働きをするものなのでしょうか?

補足日時:2009/05/16 18:03
    • good
    • 0
この回答へのお礼

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

なるほど、if文でならできるのですね。
switch文とif文で互換性がある。と覚えてから、どちらも同じことしかできないと勘違いをしていました。

ifで書き直してみたいと思います。

お礼日時:2009/05/16 18:02

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!