[英]C Char Switch inside a switch statement returns case expression not constant
我目前正在嘗試在交換機內部運行交換機。
第一個switch語句是從用戶那里接收一個選項,並且其中一個選項是“ O”,並顯示在下面。
我從Visual Studio收到2個錯誤
表達式必須是整數常量表達式
情況表達不恆定
這些錯誤在我正在檢查案例“ NAASA”的行上彈出
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;
您不能將字符串文字用作大小寫標簽中的值。 這就是MSVC在您嘗試使用"NAASA"
時會告訴您的內容。
其他人為什么工作? 因為它們不是字符串文字。 它們是字符常量(不是字符串!),具有實現定義的含義。
2整數字符常量是由單引號引起的一個或多個多字節字符的序列,例如'x'。
...
10整數字符常量的類型為int。 包含映射到單字節執行字符的單個字符的整數字符常量的值是解釋為整數的映射字符表示形式的數值。 包含多個字符(例如,“ ab”)或不映射到單字節執行字符的字符或轉義序列的整數字符常量的值是實現定義的。
單引號和雙引號在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*/) {
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.