2017-03-27 7 views
0

enter image description hereC Char switch文の中のスイッチは、定数ではないcase式を返します。

現在スイッチ内でスイッチを実行しようとしています。

最初のswitch文は、ユーザからオプションを受け取り、オプションの1つが「O」であり、下に表示されます。

私は

式が一定ではない
整数定数式
ケース式がこれらのエラーは、私はケース「NAASA」をチェックしてるの行にポップアップされなければならないのVisual Studioから2つのエラーを受け付けております

 case 'O': 
     printf("Please enter your Company ID:"); 
     scanf_s("%30s", &companyIdLookup,30); 
     switch (companyIdLookup[30]) { 
     case 'BCFS': 
      strcpy_s(companyIdLookup, 30, companyId); 
      strcpy_s(companyNameLookup, 256, "Blue Fish Space Co"); 
      discountRateLookup = 0; 
      discountTypeLookup = 0; // 0=Not applicable 1=Before Tax 2=after Tax 3=before tax if over $14,500 
      payTaxLookup = 0; // 0 = No 1=Yes 
      strcpy_s(pickUpBayLookup, 30, "MERCY"); 
      foundCompany = 1; 
      break; 
     case 'ECP': 
      strcpy_s(companyIdLookup, 30, companyId); 
      strcpy_s(companyNameLookup, 256, "Elon Cannon Personal"); 
      discountRateLookup = 1.0; 
      discountTypeLookup = 1; // 0=Not applicable 1=Before Tax 2=after Tax 3=before tax if over $14,500 
      payTaxLookup = 1; // 0 = No 1=Yes 
      strcpy_s(pickUpBayLookup, 30, "KIT"); 
      foundCompany = 1; 
      break; 
     case 'ECF': 
      strcpy_s(companyIdLookup, 30, companyId); 
      strcpy_s(companyNameLookup, 256, "Eloan Credit Finance"); 
      discountRateLookup = 1.5; 
      discountTypeLookup = 2; // 0=Not applicable 1=Before Tax 2=after Tax 3=before tax if over $14,500 
      payTaxLookup = 1; // 0 = No 1=Yes 
      strcpy_s(pickUpBayLookup, 30, "MERCY"); 
      foundCompany = 1; 
      break; 
     case "NAASA"://error is here < ---------------- 
      strcpy_s(companyIdLookup, 30, companyId); 
      strcpy_s(companyNameLookup, 256, "NAASA"); 
      discountRateLookup = 0; 
      discountTypeLookup = 0; // 0=Not applicable 1=Before Tax 2=after Tax 3=before tax if over $14,500 
      payTaxLookup = 1; // 0 = No 1=Yes 
      strcpy_s(pickUpBayLookup, 30, "MERCY"); 
      foundCompany = 1; 
      break; 
     case 'AARG': 
      strcpy_s(companyIdLookup, 30, companyId); 
      strcpy_s(companyNameLookup, 256, "AARG"); 
      discountRateLookup = 22.5; 
      discountTypeLookup = 3; // 0=Not applicable 1=Before Tax 2=after Tax 3=before tax if over $14,500 
      payTaxLookup = 1; // 0 = No 1=Yes 
      strcpy_s(pickUpBayLookup, 30, "KIT"); 
      foundCompany = 1; 
      break; 
     default : 
      break; 

     }//End of O switch 
     break; 
+0

とコンパイラが ' 'BCFS''について何言ってんの? –

+0

エラーを返さなかった:4文字以上で終了した後にのみエラーを返していた – PloxPanda

答えて

3

ケースラベルの値として文字列リテラルを使用することはできません。それは"NAASA"を使用しようとすると、MSVCがあなたに伝えていることです。

他の機能はなぜ機能しますか?文字列リテラルではないためです。それらは文字定数であり(文字列ではありません)、実装定義の意味があります。

6.4.4.4 Character constants

2整数文字定数は、「X」のように単一引用符で囲まれた一つ以上のマルチバイト文字のシーケンスです。
...
10整数型の定数はint型です。 1バイトの実行文字にマップされる1文字を含む整数文字定数の値は、マップ文字の整数の解釈の数値です。複数の文字( 'ab'など)を含む整数文字定数の値、または1バイトの実行文字にマップされない文字またはエスケープシーケンスを含む整数値の定数は、実装定義です。

一重引用符と二重引用符は、他の言語でも使用できるため、Cでは互換性がありません。

文字列の値に分岐する場合は、最初に整数に変換する必要があります。例えば:

struct { 
    char const * str; 
    int   num; 
} branch[] = { 
    { "O",  0 }, 
    { "BCFS", 1 }, 
    { "NAASA", 2 }, 
    // etc 
} 

int num = -1; 
for (int i = 0; i < sizeof(branch)/sizeof(branch[0]); ++i) 
    if (strcmp(input, branch[i].str) == 0) { 
    num = branch[i].num; break; 
    } 

switch(num) { 
default: 
    perror("not at a valid option"); 
    break; 
case 0: 
    // other things 
case 1: 
} 

またはif文のチェーンを使用します。

if(strcmp(input, "O") == 0) { 

} else if(strcmp(input, "BCFS") == 0) { 

} else if(/*etc*/) { 

} 
+0

ありがとう!私はIf文のチェーンを行うでしょう – PloxPanda

+0

@StoryTeller、私は完全に間違っているようです。 VC2008の小テストでは、 'c == 'C'と 'int c =' EBC 'の' c == 454243h'の 'char c =' EBC'の結果が明らかになりました。文字定数です。私は今日何かを学んだようです... –

関連する問題