# switch/case



## newbie89 (19. August 2009)

hi,
habe ein Problem


```
int main(void)                                                                      // Hauptprogramm


{
    
    eingabe();                                                                     // Aufruf Funktion: Eingabe
    berechnung();
   
  switch(auswahl=getchar());
            case'1': { auswahl1()  };
  
    system("PAUSE");	
    return 0;
}
```

Dabei soll auswahl1 eine funktion sein geht aber nicht mit Fehler:
             case label not within a switch statement


----------



## deepthroat (19. August 2009)

Hi.

siehe z.B. http://www-numi.fnal.gov/offline_software/srt_public_context/WebDocs/Companion/cxx_crib/switch.html

Gruß


----------



## 3Cyb3r (19. August 2009)

Funktioniert einwandfrei bei Beachtung der Syntax.


```
int main(int argc, char* argv[])
{
	eingabe();                                                                    
	berechnung();
	char auswahl;
   
	switch(auswahl=getchar())
	{
		case'1': { auswahl1();  }
	}
  
    system("PAUSE");	
	return 0;
}
```


----------



## newbie89 (19. August 2009)

```
int auswahl=0;
int main(void)                                                                      // Hauptprogramm


{
    
    eingabe();                                                                     // Aufruf Funktion: Eingabe
    berechnung();
    
  if (C!=0)  
   {
     printf("Auswahl: Kostenoptimiert <1> oder Technisch-Optimal <2>\n\n");
     do

       {
          switch(auswahl=getchar())
            
            case '1':   {auswahl1();
                         break; 
                         } 
             
             case '2':   {auswahl2();
                        }break;                           
                                      
            
                          
                           
                                    
       } while (auswahl!=1 && auswahl !=2); 
    }
    
    system("PAUSE");	
    return 0;

}
```

Hier kommt nun der Fehler   case label not within a switch statement .
Wo ist denn hier der Fehler das Break brauch ich doch das er aus der Schleife hüpft?


----------



## PlushTonberry (19. August 2009)

```
int auswahl=0;
int main(void)                                                                      // Hauptprogramm


{
    
    eingabe();                                                                     // Aufruf Funktion: Eingabe
    berechnung();
    
  if (C!=0)  
   {
     printf("Auswahl: Kostenoptimiert <1> oder Technisch-Optimal <2>\n\n");
     do

       {
          switch(auswahl=getchar())
            { // <------ Klammer auf
            case '1':   {auswahl1();
                         break; 
                         } 
             
             case '2':   {auswahl2();
                        break; 
                        }        // <-- Klammer nach dem Break
              }  // <------- Klammer zu                       
            
                          
                           
                                    
       } while (auswahl!='1' && auswahl !='2'); // <-- Vergleich auf char-Werte
    }
    
    system("PAUSE");	
    return 0;

}
```

Geschweifte Klammern sollten helfen.


----------



## Matthias Reitinger (19. August 2009)

Hallo,

schau dir die Syntax von switch doch mal genau an. Die einzelnen Fälle müssen in { } eingeschlossen sein. Bei einem break wird hier nicht die Schleife verlassen, sondern auf die Stelle nach dem switch-Statement gesprungen. Die Abbruchbedingung der Schleife ist übrigens falsch (1 ist nicht gleich '1').

Grüße,
Matthias


----------



## newbie89 (19. August 2009)

Hi,

kannst du mir eventl. klar machen warum man bei der while schleife auf char '1' vergleichen muss


----------



## PlushTonberry (19. August 2009)

Aus dem selben Grund, warum du auch case '1' und nicht case 1 schreibst.  

Mit     auswahl=getchar()   liesst du ja ein Zeichen/Char von der Tastatur ein.
Da auswahl ein int ist, wird dort nicht 1 sondern der Wert für das Zeichen 1, müsste glaub ich dezimal betrachtet 49 sein, gespeichert.

Du könntest also im Prinzip auch auswahl != 49 schreiben, da '1' == 49 ist (unter der Voraussetzung das ich die ASCII-Tabelle richtig im Kopf hab....).


----------



## Mr Apfelkuchen (20. August 2009)

Ja haste recht char 1 ist 49^^
Zu ASCII kannst du dir das auchmal angucken:
http://de.wikipedia.org/wiki/American_Standard_Code_for_Information_Interchange
Dabei ist vor allem die Tabelle interesant denke ich^^
mfg Apfelkuchen


----------



## newbie89 (20. August 2009)

Ich komm im Moment nicht weiter.

wenn ich jetzt z.B. haben möchte dass ich aus der switch Sache raus komme, 
                        (z.B. es gint jemand eine 3 ein )
nehme ich dann am Besten einen default anstatt case und schreibe in diese default Anweisung break rein oder wie macht man das am Besten 

Viele Grüße newbie


----------



## vfl_freak (20. August 2009)

Moin,

schau doch einfach auf den Link, den Dir deepthroat am Anfang schon geschickt hat ... da steht doch alles drin 

Das entscheidende ist :

```
switch ( test ) {

  case 1 : 
    // Process for test = 1
    ...
    break;

  case 5 : 
    // Process for test = 5
    ...
    break;

  default : 
    // Process for all other cases.
    ...
}
```

Gruß
Klaus


----------



## MiMi (20. August 2009)

Wenn Leute zu faul sind, sich nen Link anzuschauen, zeigt das meist das sie net wirklich interesse haben programmieren zu lernen


----------



## newbie89 (21. August 2009)

Bin nicht zu faul es geht nur nicht irgendwo hab ich wieder nen beschissenen Fehler drin der für euch leicht ist und für mich nicht das ich erst seit 10 std programmiere will hier niemand kappieren....... sauerei.... hab ich schon besser erlebt....

Falls mir mal jemand helfen will :
Die While Schleife wiederholt sich, aber der switch befehl wird nicht ein 2.mal aufgerufen...

Dankeschön!!



```
{
     do

       { printf("Auswahl: Kostenoptimiert <1> oder Technisch-Optimal <2>" );     // oder ENDE <3>\n\n
    
                      
          auswahl=0;
                     
          switch(auswahl=getchar())
            {
            case '1':   {auswahl1();break;  }
                         
                         
             
             case '2':   {auswahl2();break;   }   
                                                         
                               
               
              //default: {};break;
            
            }              
          printf("Wiederholen Ja[J]/Nein[N]?")    ;             
          scanf("%s",&wieder)  ;                       
      
       } while (wieder[0]== 'j' || wieder[0]=='J');   
    }
               
             }
```


----------



## Matthias Reitinger (21. August 2009)

Hallo,

das Hauptproblem hier dürfe sein, dass getchar nur das nächste Zeichen einliest. scanf lässt allerdings den Zeilenumbruch noch im Eingabepuffer stehen, sodass getchar dann im Anschluss eben diesen Zeilenumbruch ausliest. Du könntest aber statt scanf auch getchar verwenden (du bist ja nur an einem Zeichen interessiert), im Anschluss aber solange die restlichen Zeichen im Eingabepuffer auslesen, bis du auf einen Zeilenumbruch stößt:
	
	
	



```
while (getchar() != '\n') /* noop */;
```
Selbiges müsstest du dann aber natürlich auch beim ersten getchar machen.

Grüße, Matthias


----------



## newbie89 (21. August 2009)

Vielen Dank für den Hinweis!

Hab einfach mit fflush stdin das Problem beseitigt!


----------



## deepthroat (21. August 2009)

newbie89 hat gesagt.:


> Vielen Dank für den Hinweis!
> 
> Hab einfach mit fflush stdin das Problem beseitigt!


Was aber nicht definiert ist, da fflush nur auf Ausgabeströme angewendet werden darf. Siehe z.B. http://faq.cprogramming.com/cgi-bin/smartfaq.cgi?answer=1052863818&id=1043284351

Gruß


----------

