string to int w instrukcji switch

0

mam 4 znakowego stringa (tablica charów).
Chcę teraz przetestować w instrukcji switch. Wymyśliłem, że mogę go rzutować na inta, co nie powoduje żadnego problemu.
W case chciałbym zrobić coś takiego:

case (int)"abc":

jednak taki zabieg nie działa.

Wywala mi:
error: case label does not reduce to an integer constant

Macie jakiś inny pomysł?

Tych porównań jest dość dużo, więc wolałbym nie używać IFów.

0

case 'abcd' - literał (wielo)znakowy, nie string. Tylko o endianach pamiętaj.

0
  1. w case mogą być tylko i wyłącznie STAŁE znane podczas kompilacji.
  2. taki string jest reprezentowany przez wskaźnik, więc twoja konwersja jest bezsensu.

Jeśli się uprzeć to MOŻE da się tak (sam przetestuj):

union FourCharsUnion {
    char chars[5]; // piąty znak na zero
    long int number;
}

const FourCharsUnion ABC = "abc";
...
case ABC.number:
...
0

Nie ma prawa przejść.

0

Mam jeszcze taki pomysł (to powinno zadziałać):

#define BUILD_INT(str) (str[0]+0x100*(str[1]+0x100*(str[2]+0x100*str[3])))

buildInt(char str[4]) {
       return BUILD_INT(str);
}

char StalaText1[] = "abc";

switch(buildInt(twojStringWejsciowy)) {
case BUILD_INT(StalaText1):
    ...
    break;

case BUILD_INT(StalaText2):
    ...
    break;
}

Tylko uważaj, żeby stałe tekstowe nie były za krótkie (dopełniaj je zerami)!

0

Nie, to nie ma prawa działać, kolejny raz zresztą... Moja stara propozycja ubrana w kodu, kompilator może się czepiać, że wieloznakowa stała chociaż jest to poprawne.

switch (*(int*)"anal") {
case 'lana': // little-endian
    puts("zuo!");
    break;
...

1 użytkowników online, w tym zalogowanych: 0, gości: 1