2012-03-24 14 views
4

Ich arbeite an einer kleinen Hausaufgabe und ich soll ein Essensmenü machen. Wie auch immer, mein Schalter funktioniert nicht. Ich versuche, eine einfache Funktion zu verwenden, die ich einen Wert von „Fisch“ passieren kann, „trinken“ oder „Chips“ auf und dann wird es Ausgabe:Switch-Anweisung mit Zeichenfolgen?

"Are you ordering FISH?" (or chips/drink) 

Ich kann den Schalter nicht bekommen arbeite, es soll erkennen, was ich hineinlasse und dann einen printf ausgeben, basierend auf dem switch case.

Code:

#include <stdio.h> 

void menu() { 
    printf("\nWelcome to Sunny FISH & CHIPS!\n\n"); 
    printf("########  Fish :  Haddock(K) Large(L) | $5.00\n"); 
    printf("# FOOD #    Halibut(T) Large(L) | $4.00\n"); 
    printf("########  Chips:  Cut(C)  Large(L) | $2.00\n"); 
    printf("      Ring(R) Large(L) | $3.00\n"); 
    printf("           | \n"); 
    printf("########## Soft Drinks(S)  Large(L) | $2.00\n"); 
    printf("# DRINKS # Coffee(C)    Large(L) | $1.75\n"); 
    printf("########## Tea(T)    Large(L) | $1.50\n"); 
    printf("---------------------------------------------\n"); 
    printf("Note: Medium price: 80%% of large.\n"); 
    printf("  Small price: 60%% of large.\n"); 
    printf("TAX is 10%%.\n"); 
    printf("More than 5 fish, 10%% discount on drink.\n"); 
    printf("Every 10 fish purchased, get 1 free softdrink.\n"); 
    printf(" - size of drink is according to size of fish\n"); 
} 

void question (char choice[5]) { 
    switch (choice[5]) 
    { 
     case choice["fish"]: 
      printf("Do you order FISH?\n"); 
     case choice["drink"]: 
      printf("Do you order CHIPS?\n"); 
     case choice["chips"] : 
      printf("Do you order DRINKS?\n"); 
     default : 
      printf("Enter a valid choice: \n"); 
    } 
} 

main() { 

    // menu(); 
    question("fish"); 

} 

Antwort

6

Zusätzlich zu den anderen Antworten, wenn Sie feststellen, dass Ihre Auswahlliste alle mit einem einzigartigen Buchstaben beginnen (oder einen eindeutigen Buchstaben in einer anderen Position hat), dann können Sie switch auf dem Brief:

switch (choice[0]) { 
case 'f': 
    // they chose fish 
    break; 
case 'c': 
    // they chose chips 
    break; 
case 'd': 
    // they chose drink 
} 

Dies wird schneller als mit strcmp (obwohl es für Ihren Fall spielt keine Rolle) und ist weniger wartungsfreundlich. Es ist jedoch gut, alle Optionen zu kennen und zu wissen, wie Sie einige dieser Dinge nutzen können.

+0

In jedem Fall sollten Sie 'strcmp' verwenden, um sicherzustellen, dass die vollständige Zeichenfolge tatsächlich übereinstimmt. –

+0

@R .. Wie gesagt, dies funktioniert nur dann richtig, wenn jede Wahl einen eindeutigen Buchstaben in einer bestimmten Position hat. –

+1

Das ist ein separates Problem. Mein Punkt ist, dass Ihre Lösung auch andere Zeichenfolgen akzeptiert, die mit demselben Buchstaben beginnen, aber nicht in der Liste enthalten sind. –

2

C unterstützt keine Schalter auf Strings ... Sie verwenden sollten strcmp()

1

switch funktioniert nicht wie in C. Sie benötigen zu machen ein if Anweisungskonstrukt und strcmp() verwenden, um die Zeichenfolgen zu vergleichen.

6

Sie können die Anweisung switch nicht mit Zeichenfolgen verwenden.

Sie können strcmp verwenden, um Strings zu vergleichen.

if (strcmp(choice,"fish")==0) { 
    //fish 
} 
else if (strcmp(choice,"drink")==0) { 
    //drink 
} 
. 
. 
. 
6

C nicht Unterstützung, die Art Schalter, aber wenn wäre es, die Syntax

switch(choice) 
{ 
    case "fish": 
     something(); 
     break; 
    case "drink": 
     other_thing(); 
     break; 
} 

Ein Schalter für mich sein würde, ist oft klarer als eine (lange) Liste, wenn - sonst wenns. Obwohl in diesem Fall scheint es zu kompliziert, ich würde bevorzugen Ansätze wie folgt aus:

#include <stdio.h> 
#include <string.h> 

enum menu_items { FISH, DRINK, CHIPS, UNKNOWN }; 

struct items 
{ 
    char *name; 
    enum menu_items id; 
} items_list[] = { 
    { "fish", FISH }, 
    { "drink", DRINK }, 
    { "chips", CHIPS } 
}; 

int main(void) 
{ 
    int i; 
    enum menu_items mid; 
    struct items *choice = NULL; 

    // ... 

    for(i = 0, choice = NULL; i < sizeof items_list/sizeof (struct items); i++) 
    { 
    if (strcmp(answer, items_list[i].name) == 0) 
    { 
     choice = items_list + i; 
     break; 
    } 
    }  

    mid = choice ? choice->id : UNKNOWN; 

    // the following would be enough to obtain the output of your example; 
    // I've not embodied the code into a func, but it's easy to do if you need 
    if (mid != UNKNOWN) 
    { 
     // the function a_func transforms the string of the food 
     // e.g. to uppercase, or it could map it to whatever according to some 
     // other data... or expand the struct to hold what you want to output 
     // with "fish", "drink", "chips", e.g. choice->screen_name 
     printf("Do you order %s?\n", a_func(choice->name)); 
    } 
    else 
    { 
     printf("Enter a valid choice:\n"); 
    } 
    // --------- 

    // or if you prefer the switch you have something like: 

    switch(mid) 
    { 
    case FISH: 
    printf("fish\n"); 
    break; 
    case DRINK: 
    printf("drink\n"); 
    break; 
    case CHIPS: 
    printf("chips\n"); 
    break; 
    default: 
    printf("unknown choice\n"); 
    break; 
    } 

    return 0; 
} 

Wenn Sie richtig den Ansatz wählen, könnten Sie den Code immer gleich und nur wachsen, Ihre Daten.

+0

Ich habe gelesen, es ist nur eine Hausaufgabe ... – ShinTakezou

Verwandte Themen