如何输入字符串并在Switch命令中使用它这是代码,但我得到的开关量不是整数错误。
#include <stdio.h>
int main(void) {
float usd2 = 0.9117;
float yen2 = 0.0073;
float pound2 = 1.4137;
float eingabe;
char whr[] = "";
printf("Bitte Summe in EURO eingeben: ");
scanf("%f", &eingabe);
printf("Die Währungnummer eingeben USD, YEN, POUND: ");
scanf("%s", &whr);
switch(whr) {
case "usd": printf("%.4f EURO es sind dann %.4f USD.", eingabe, (eingabe/usd2));
break;
case "yen": printf("%.4f EURO es sind dann %.4f YEN.", eingabe, (eingabe/yen2));
break;
case "pound": printf("%.4f EURO es sind dann %.4f POUND.", eingabe, (eingabe/pound2));
break;
default: printf("Falsche eingabe.");
break;
}
return 0;
}
最佳答案
在C中,不能在switch语句的条件或label常量表达式中使用“string”(在您的情况下是字符数组),因为它们不能转换为整数值。C要求条件和常量表达式为整型(例如,this online c++ standard draft):
6.8.4.2 switch语句
switch语句的控制表达式应为整数
键入。
...
3每个案例标签的表达式应为整数常量
表达式。。。
为了克服这个问题,可以使用if (strcmp(whr,"USD")==0) else if (strcmp(whr, "YEN")==0)...
的级联,或者引入一个表示货币的枚举,并将用户输入映射到这样的枚举。
由于if-else
-级联是直接向前的,所以我只展示第二种方法。使用枚举的优点是,您可以轻松地在整个程序中使用它们,而无需在代码的不同位置重复if-else
-级联:
typedef enum {
UNDEFINED, USD, YEN, POUND
} CurrencyEnum;
struct currencyLabel {
CurrencyEnum currencyEnum;
const char *currencyString;
} currencyLabels[] = {
{ USD, "USD" },
{ YEN, "YEN" },
{ POUND, "POUND" }
};
CurrencyEnum getCurrencyByLabel(const char* label) {
for (int i=0; i< (sizeof(currencyLabels) / sizeof(struct currencyLabel)); i++) {
if (strcmp(label, currencyLabels[i].currencyString) == 0)
return currencyLabels[i].currencyEnum; // could use strcasecmp or stricmp, if available, too.
}
return UNDEFINED;
}
int main(void) {
float usd2 = 0.9117;
float yen2 = 0.0073;
float pound2 = 1.4137;
float eingabe;
char whr[10] = "";
printf("Bitte Summe in EURO eingeben: ");
scanf("%f", &eingabe);
printf("Die Währungnummer eingeben USD, YEN, POUND: ");
scanf("%s", whr);
CurrencyEnum currency = getCurrencyByLabel(whr);
switch(currency) {
case USD: printf("%.4f EURO es sind dann %.4f USD.", eingabe, (eingabe/usd2));
break;
case YEN: printf("%.4f EURO es sind dann %.4f YEN.", eingabe, (eingabe/yen2));
break;
case POUND: printf("%.4f EURO es sind dann %.4f POUND.", eingabe, (eingabe/pound2));
break;
default: printf("Falsche eingabe.");
break;
}
return 0;
}
顺便说一句:请注意,将
whr
定义为char whr[] = ""
实际上保留了一个大小为1的字符串,在scanf
中使用它会产生溢出(和未定义的行为)。您可以将其定义为char whr[10]
或类似的内容。