解決策: switch文のエラーについて

このQ&Aのポイント
  • switch文のエラーが発生する原因として、switchの式で整数型を使用する必要がある点が挙げられます。
  • このプログラムでは、setBloodメソッドの引数としてstring型の変数が使用されていますが、switch文は整数型にしか対応していません。
  • したがって、setBloodメソッドで受け取った文字列を整数型に変換する必要があります。
回答を見る
  • ベストアンサー

switch文のエラーについて

次のプログラムを実行したら slect.cpp:In member function `void select::setBlood(std::string)': slect.cpp:16:error: switch quantity not an integer が出ました。switch文の何が不完全ですか?教えてください。 #include<iostream> #include<string> using namespace std; class select { private: string blood; public: void setBlood(string b); void show(); }; void select::setBlood(string b){ blood=b; switch(b){ case 'A': cout<<"A is best"<<endl; break; case 'B': cout<<"B is best"<<endl; break; case 'AB': cout<<"AB is best"<<endl; break; case 'O': cout<<"O is best"<<endl; break; default: cout<<"crazy"<<endl; break; } } void select::show(){ cout<<"Your blood type is :"<<blood<<endl; } int main(){ string b; select Q; cout<<"Please Input your Blood type in A or B or AB or O:"<<endl; cin>>b; Q.setBlood(b); Q.show(); return 0; }

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

  • ベストアンサー
  • momenlara
  • ベストアンサー率60% (6/10)
回答No.3

> switch(b) switch文の条件に指定できるのは「整数」のみになります。 上記のソースでは、bがstringなのでコンパイルエラーになっています。 いくつか修正方法がありますが、一般的には以下の2つが妥当でしょうか。 1) if文で判定する if(b.compare("A") == 0){ cout<<"A is best"<<endl; } else if (b.compare("B") == 0) { cout<<"B is best"<<endl; } ... 2) 定数を使う あらかじめ血液型に対して定数を割り当てておきます。 #define BLOOD_A 1 #define BLOOD_B 2 ... setBlood(int b)として、このメソッドでは上記の定数のいずれかを受け取り、switch文で判定するように仕様を変更する。 この方法でも、入力が文字列しかない場合には、どこかで文字列の中身を判定して、定数に置き換えないといけませんけどね。

zero-0
質問者

お礼

If文使ってやることにしました。 アドバイスありがとうございます。

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.2

エラーメッセージに書いてありますよ。 「switchの量が整数じゃない」 switch(string型)はだめです。 ifを使いましょう。

zero-0
質問者

お礼

if文を使ってみます。 ご意見ありがとうございます。

zero-0
質問者

補足

ここだけif文に直してみたんですがこのようなエラーが出ました。 select.cpp: In member function `void select::setBlood(std::string)': 123.cpp:16: error: could not convert `(&b)->std::basic_string<_CharT, _Traits, _ Alloc>::operator= [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>](65)' to `bool' selct.cpp:19: error: could not convert `(&b)->std::basic_string<_CharT, _Traits, _ Alloc>::operator= [with _CharT = char, _Traits = std::char_traits<char>, _Alloc = std::allocator<char>](66)' to `bool' ここからif文 void select::setBlood(string b){ blood=b; if(b='A'){ cout<<"A is best"<<endl; } else if(b='B'){ cout<<"B is good"<<endl; } else{ cout<<"crazy"<<endl; } }

  • 5S6
  • ベストアンサー率29% (675/2291)
回答No.1

今手元にコンパイラがないのでチェックしてませんが おや?と思ったのが switchは1バイト文字しか認識できないような。 case 'AB'; が駄目なような気がします。 間違ってたらごめんなさい。 でもここも間違っている気がします。

関連するQ&A

  • do-while 文でコンパイルエラーがでます。。

    下記グローバル関数Run内のdo-while文で、 error C2059: syntax error : '}' というコンパイルエラーが起きるのですが、どうしても理由がわかりません; do-whileをコメントアウトしコンパイルしてみたところ正常に動くので、そこがおかしいのは間違いないと思います。 どなたかお力添えをお願いいたします。。 #include <iostream> #include "BinaryTree.cpp" using namespace std; void Run(); int main() { Run(); return 0; } void Run() { BinaryTree<int> *bt; char input; do { cout<<"Menu Display"<<endl; cout<<"---------------------"<<endl; cout<<"1> Enter data"<<endl; cout<<"2> Print Tree"<<endl; cout<<"3> Reverse Tree"<<endl; cout<<"4> Quit"<<endl; cout<<"Enter your choice: "; cin>>input; switch (input) { case '1': int elem; cout<<"Enter data for tree: "; cin>>elem; if (bt == NULL) bt = new BinaryTree<int>(elem); else bt->Insert(elem); break; case '2': if (bt == NULL) cout<<"The tree is empty."<<endl; else { cout<<"Tree size = "<<bt->Size(bt)<<endl; cout<<"---------------------"<<endl; bt->Inorder(bt); } break; case '3': if (bt == NULL) cout<<"The tree is empty."<<endl; bt->Reverse(bt); break; }while (input != '4'); } }

  • switch文で文字を比較することは出来ませんか?

    switch文で文字を比較することは出来ませんか? 例えば… int main(void){ char buf[5]; buf = 'b'; switch(buf){ case 'a': ・  ・  ・  break; case 'b': ・  ・  ・  break; }

  • switch文について

    独学でjavaの勉強をしているのですが、switch文が本のとおりに入力しても エラーがでて困っています。どこが間違っているのかわかりません。 ちなみにプログラム内容は class bunki2{ public static void main(String args[]){ int a; a=1; switch (a) { case1:System.out.println("変数aの値は1です。"); break; case2:System.out.println("変数aの値は2です。"); break; case3:System.out.println("変数aの値は3です。"); break; } } } です。 これでコンパイルしようとすると’case’、’default’、または’}’がありません。とでます。 なぜできないのか教えてください。

    • ベストアンサー
    • Java
  • switch文について

    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・・・というようにしたいのですが、どう指定したらいいのかがわかりません。一文字だけなら「''」で囲むのはわかるのですが、文字列となると・・・ どなたかご教授願えませんでしょうか?

  • stringのデータではswitch文は使えない?

    String^ id_data_str というのに、"313131313131"というデータを入れて、下のGet_idというクラスを作って、”111111”というデータをとれるようにしたいと思ったのですが、 Get_id^ Get_id; Get_id_get(id_data_str); switch文は整数型出ないとダメだというエラーが出てきたのですが、このようなクラスのプログラムはダメなんでしょうか?何か解決方法などいただけませんでしょうか? namespace HomeBank { using namespace System; using namespace System::Collections::Generic; /** * 明細データクラス */ ref class Get_id { private: public: String^ ID_str; String^ ID_str_complete; //array<String^>^ Wireless_ID_str = gcnew array<String^>(32); public: Get_id() { ID_str = "test"; ID_str_complete = "test"; } void Get_id_get(String^ ID_str) { int i; String^ test_str; String^ str_data; Get_id(); ID_str_complete = ID_str; for(i=0;i<6;i++) { test_str = ID_str->Substring( i*2, 2 ); switch(test_str) { case "30": str_data = "0"; break; case "31": str_data = "1"; break; case "32": str_data = "2"; break; case "33": str_data = "3"; break; case "34": str_data = "4"; break; case "35": str_data = "5"; break; case "36": str_data = "6"; break; case "37": str_data = "7"; break; case "38": str_data = "8"; break; case "39": str_data = "9"; break; case "61": str_data = "A"; break; case "62": str_data = "B"; break; case "63": str_data = "C"; break; case "64": str_data = "D"; break; case "65": str_data = "E"; break; case "66": str_data = "F"; break; default; str_data = "_"; break; } if(i==0) ID_str_complete = str_data; else ID_str_complete += str_data; } } }; }

  • 下記、プログラム内の「char *」の役割

    C++初心者です。 縦長になってしまいますが、 『 #include <iostream.h> void show(int); void show(double); void show(char *);   ←左記の記述の使い方 int main(void) { show(1); show(0.25); show("文字列"); return 0; } void show(int x) { cout << x << endl; } void show(double y) { cout << y << endl; } void show(char *z) { cout << z << endl; } 』 のプログラムにおいて、「char *」の使い方がいまいち理解できません。 上記プログラムですとエラーが表示されないのですが、下記のプログラムだとエラーが発生します。 『 #include <iostream.h> void show(int); void show(double); void show(char);   //←---------上記と違う行 int main(void) { show(1); show(0.25); show("文字列"); return 0; } void show(int x) { cout << x << endl; } void show(double y) { cout << y << endl; } void show(char z) {  //←---------上記と違う行 cout << z << endl; } 』 なぜ、ポインタ(*)を付けないといけないのか分かりやすく教えていただけましょうか。

  • クラスの変換について

    C#のクラスの変換についてお尋ねします。 switch文を使ってstring型で受けた値を int型に変換したいのですが、 下記コードの ” Convert.ToInt32(bloodType) ” のところでエラーになります。 どうすればint型に変換できるでしょうか? どなたか宜しくお願い致します。 string bloodType = ""; switch(bloodType) { case "A型": bloodType = "1"; break; case "B型": bloodType = "2"; break; case "O型": bloodType = "3"; break; case "AB型": bloodType = "4"; break; } int bloodTypeId = Convert.ToInt32(bloodType);

  • Switch文における、returnとbreakについて

    いつもお世話になります。 今回は、switch文において質問します。 XOOPSの中のスクリプトからですが、 ■ A code: --------------- switch($esc_type){ case 'html': return htmlspecialchars($string, ENT_QUOTES, $char_set); case 'htmlall': return htmlentities($string, ENT_QUOTES, $char_set); -----(中略)------ default: return $string; } ■ B code: --------------- switch($level){ case '1': return '\part{'; break; -----(中略)------ case '6': return '\subparagraph{'; break; } というのがありますが、 質問(1) switch文には故意にbreakを書かないのちょっと別として、 return は、breakを、省略できるのか、それともこれらは、等価なのか、 それとも、やはり、returnでもbreakを書くのがいいのか、教えてください。 質問(2) また、通常では、defaultでも、break が必要だとおもいますが、 省略?されているのも結構ありますが、breakがあるのが正解ですか? それとも、defaultでbreakはもともと必要ないのですか? これも教えてください。 どうか、よろしくお願いします。

    • 締切済み
    • PHP
  • switch文caseについて

    switchのcaseについてですが、数字を直接記述せずに、const変数に値を代入して使用出来ますか? 例) const int A = 1; const int B = 2; switch(suuti){ case A: 処理; break; case B: 処理; break; } コンパイルすると、「case 式は、整数型定数でなければなりません。」と出てきてしまうのですが、直接数値を記述しないといけないのでしょうか? よろしくお願いします。

  • switch で疑問。java超初心者です。

    まず、 public class P1{   public static void main(String[] args){     int n = 1;       switch(n){         case 0:           System.out.println("あ");           break;         case 1:           System.out.println("い");           break;         case 2:           System.out.println("う");           break;         default:           System.out.println("え");       }   } } は、当然「い」と表示されますよね。 default: をcase 3:にしても、問題なく「い」と表示されました。 そこで、こんな風にしてみました。 public class P3{   public static void main(String[] args){     int n = 1;     String s;       switch(n){         case 0:           s="あ";           break;         case 1:           s="い";           break;         case 2:           s="う";           break;         default:           s="え";       }       System.out.println(s);   } } これは「い」と表示されましたが、 default: をcase 3:にすると、エラーとなってしまいます。なぜでしょう。 ちなみに、エラーの内容は 変数 s は初期化されていない可能性があります。     System.out.print(s);                ^ というものでした。 そこで、 変数 s を初期化してみようと、次のように変数 s の宣言の後に null を代入しました。 String s=null; すると、「い」と表示され、エラーは出ません。 なぜ、このようになるのでしょうか。 String型の変数を使っていて、今まではこのようなエラーは出た事が無かったのですが、 どうやらswitch文の中では、初期化しろ、と出てくるようです。 わかり易い解説をいただければと思います。 これは仕様だということで、この通り受け入れるしかないのでしょうか。 勉強していて、少々腑に落ちないので、質問致しました。 よろしくお願いいたします。

    • ベストアンサー
    • Java

専門家に質問してみよう