开关盒的C输入

时间:2017-08-08 21:02:17

标签: c input switch-statement

如何输入String并在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;
}

3 个答案:

答案 0 :(得分:6)

C中没有办法在switch语句的条件或标签常量表达式中使用“string”(在你的情况下是一个字符数组),因为它们不能转换为整数值。 C要求条件和常量表达式是整数类型(例如,参见this online c++ standard draft):

  

6.8.4.2开关语句

     

1 switch语句的控制表达式应该是整数   类型。

     

...

     

3每个case标签的表达式应为整数常量   表达......

要解决此问题,您可以使用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]或类似的东西。

答案 1 :(得分:5)

C 并不像其他更高级的语言那样拥有字符串。相反,C字符串只是字符数组。这意味着像比较这样的复杂操作本身并不能真正处理字符串。

由于它们目前是设计的,因此switch语句仅对单个整数值进行操作。这可以表示为单个char或int,这有时会导致混淆。要执行您想要的操作,您需要将ifelse if语句与strcmp()函数一起使用。

if( strcmp(whr, "foo") == 0 ) {
    // do a thing
}
else if( strcmp(whr, "bar") == 0 ) {
    // do a different thing
}
else {
    // default thing to do
}

关于strcmp()函数和if语句的文档。

修改

我已经演示了一个简单的两个条件声明。实际上,else语句是可选的,您可以拥有与您一样多的else if语句。

您还需要在程序中包含字符串标头。在您的文件顶部执行此操作,其中包括stdio.h

#include <string.h>

答案 2 :(得分:0)

#include <stdio.h>
#include <string.h>
int main(void) {
    float usd2 = 0.9117;
    float yen2 = 0.0073;
    float pound2 = 1.4137;
    float eingabe;
    char whr[5] = "";

    printf("Bitte Summe in EURO eingeben: ");
    scanf("%f", &eingabe);
    printf("Die Währungnummer eingeben USD, YEN, POUND: ");
    scanf("%s", &whr);

    if( strcmp(whr, "USD") == 0 ) {
    printf("%.4f EURO es sind dann %.4f USD.", eingabe, (eingabe/usd2));
    }
    else if( strcmp(whr, "YEN") == 0 ) { // strcmp(1 array, 2 array) wenn die gleich sind gibt der 0 raus, when linke hat weniger char dann negativ und wenn linke größer dann positiv
    printf("%.4f EURO es sind dann %.4f YEN.", eingabe, (eingabe/yen2));
        }
    else if( strcmp(whr, "POUND") == 0 ) {
    printf("%.4f EURO es sind dann %.4f POUND.", eingabe, (eingabe/pound2));
        }
    else {
        printf("Falsche eingabe.");
    }


    return 0;
}