Hallo,
In C bin ich noch ein ziemlicher Anfänger und deshalb stelle ich hier eine
für die meisten unter euch "simple" Frage - es handelt sich um die
switch-Verzweigung :
include
Hallo Daniel, On 13 Jun 2003 at 15:07, Daniel Feist wrote:
Hallo,
In C bin ich noch ein ziemlicher Anfänger und deshalb stelle ich hier eine für die meisten unter euch "simple" Frage - es handelt sich um die switch-Verzweigung :
include
int main() { int a; printf("Bitte eine Zahl zwischen 1 und 5 eingeben: "); scanf("%d", &a);
switch (a){ case 1: printf("Das war eins \n"); break; case 2: printf("Das war zwei \n"); break; case 3: printf("Das war drei \n"); break; case 4: printf("Das war vier \n"); break; case 5: printf("Das war fünf \n"); break; default: printf("Falsche Eingabe\n"); } return 0; }
Ich verstehe nicht, wie der Schalter switch herausfinden kann, welchen Fall er nehmen muss - wenn es zum Beispiel andere Zeichen sind - wie +,-,*,/ oder so - wie macht er es dann? switch geht ja nach folgendem Muster vor : Ausdruck(a) == Ausdruck1 dann wird die passende Anweisung ausgeführt. Mit Zahlen ist es ja klar - aber wie geht es mit anderen ASCII-Zeichen? Ich würde mich über zahlreiche Hilfestellungen rund um switch freuen! Vielen Dank!
mit anderen Zeichen geht es so nicht direkt, da switch nur int als Parameter akzeptiert. Im beschriebenen Fall kannst du den scanf so umfummeln, dass a vom Typ char ist und den ASCII-Code des eingegeben Zeichens enthält (ich weiss grad nicht, wie das geht). Dann könntest du case-Anweisungen im Stile switch(a) // implizite Typumwandlung char->int { case 'a': ... case '2': ... case '+': ... } verwenden. Grüße Stefan
Moin,
* Stefan Sassenberg
On 13 Jun 2003 at 15:07, Daniel Feist wrote:
Ich verstehe nicht, wie der Schalter switch herausfinden kann, welchen Fall er nehmen muss - wenn es zum Beispiel andere Zeichen sind - wie +,-,*,/ oder so - wie macht er es dann?
mit anderen Zeichen geht es so nicht direkt, da switch nur int als Parameter akzeptiert.
Das geht mit jedem integralen Typ. Thorsten -- Fear leads to anger. Anger leads to hate. Hate leads to using Windows for mission-critical applications.
Daniel Feist wrote:
Mit Zahlen ist es ja klar - aber wie geht es mit anderen ASCII-Zeichen?
switch (a) { case '+': anweisung; break; case 'a': anweisung; break }
Ich würde mich über zahlreiche Hilfestellungen rund um switch freuen!
Der Vergleich von switch entspricht der Anweisung if ( a == 'a' ) { anweisung; } Peter
* Am Fre, 13 Jun 2003 schrieb Daniel Feist:
Ich verstehe nicht, wie der Schalter switch herausfinden kann, welchen Fall er nehmen muss - wenn es zum Beispiel andere Zeichen sind - wie +,-,*,/ oder so - wie macht er es dann? switch geht ja nach folgendem Muster vor : Ausdruck(a) == Ausdruck1 dann wird die passende Anweisung ausgeführt. Mit Zahlen ist es ja klar - aber wie geht es mit anderen ASCII-Zeichen?
Ein Character (char) ist in C intern eine Repräsentation einer Ganzzahl. Mach mal char testchar = 'c'; printf("%c\n",testchar); printf("%d\n",testchar); Der numerische Wert eines char ist der Ascii-Code des Zeichens. Gruß Christoph -- Christoph Maurer - 52072 Aachen - Tux#194235 mailto:christoph-maurer@gmx.de - http://www.christophmaurer.de Auf der Homepage u.a.: Installation von SuSE 7.0 auf Notebook Acer Travelmate 508 T, Elektrotechnik an der RWTH Aachen
Am Fre, 2003-06-13 um 15.07 schrieb Daniel Feist:
Hallo,
In C bin ich noch ein ziemlicher Anfänger und deshalb stelle ich hier eine für die meisten unter euch "simple" Frage - es handelt sich um die switch-Verzweigung :
include
int main() { int a; printf("Bitte eine Zahl zwischen 1 und 5 eingeben: "); scanf("%d", &a);
switch (a){ case 1: printf("Das war eins \n"); break; case 2: printf("Das war zwei \n"); break; case 3: printf("Das war drei \n"); break; case 4: printf("Das war vier \n"); break; case 5: printf("Das war fünf \n"); break; default: printf("Falsche Eingabe\n"); } return 0; }
Ich verstehe nicht, wie der Schalter switch herausfinden kann, welchen Fall er nehmen muss - wenn es zum Beispiel andere Zeichen sind - wie +,-,*,/ oder so - wie macht er es dann? switch geht ja nach folgendem Muster vor : Ausdruck(a) == Ausdruck1 dann wird die passende Anweisung ausgeführt. Mit Zahlen ist es ja klar - aber wie geht es mit anderen ASCII-Zeichen? Ich würde mich über zahlreiche Hilfestellungen rund um switch freuen! Vielen Dank!
case 'a' : printf("Das war a \n"); break; Gruß, Wolfgang
Hallo, On Fri, 13 Jun 2003, Daniel Feist wrote:
Hallo,
In C bin ich noch ein ziemlicher Anfänger und deshalb stelle ich hier eine für die meisten unter euch "simple" Frage - es handelt sich um die switch-Verzweigung :
include
int main() { int a; printf("Bitte eine Zahl zwischen 1 und 5 eingeben: "); scanf("%d", &a);
Hier ueberpruefst d das Ergebnis von scanf nicht! ==== man 3 scanf ==== RETURN VALUES [..] Zero indicates that, while there was input available, no conversions were assigned; typically this is due to an invalid input character, such as an alphabetic character for a `%d' conversion. d.h. a ist undefiniert und hat einen zufaelligen Inhalt. Was uns zum 1ten Fehler bringt, du initialisiert a nicht (wenn scanf fehlschlaegt).
switch (a){ case 1: printf("Das war eins \n"); break;
usw. Besser waere also sowas: int a = 0; int r; r = scanf("%d", &a); if ( r != ) { fprintf(stderr, "ungueltige Eingabe\n"); exit(1); } switch(a) { /* ... */ break; default: /* ... */ break; } Ich wuerde uebrigens wenn du die Tips bzgl. 'char' anwenden willst trotzdem int als Typ verwenden, da man so z.B. -1 als Fehler verwenden kann: int c; c = getchar(); if( c == EOF ) { /* Fehlerbehandlung */ } switch(c) { case '1': case '2': /* ... */ case 'q': exit(0); break; default: break; } HTH, -dnh -- Top 100 things you don't want the sysadmin to say: 47. Say, What does "Superblock Error" mean, anyhow?
Moin,
* David Haller
Besser waere also sowas:
int a = 0; int r;
r = scanf("%d", &a); if ( r != ) { ^ Da fehlt was.
Ich wuerde uebrigens wenn du die Tips bzgl. 'char' anwenden willst trotzdem int als Typ verwenden, da man so z.B. -1 als Fehler verwenden kann:
Wie meinst Du das? Thorsten -- Endorsing products is the American way of expressing individuality. - Calvin
Hallo, On Fri, 13 Jun 2003, Thorsten Haude wrote:
Moin,
* David Haller
[2003-06-13 16:55]: Besser waere also sowas:
int a = 0; int r;
r = scanf("%d", &a); if ( r != ) { ^ Da fehlt was.
*mift* Da ist irgendwie eine 1 verlorengegangen... Sollte if ( r != 1 ) { sein.
Ich wuerde uebrigens wenn du die Tips bzgl. 'char' anwenden willst trotzdem int als Typ verwenden, da man so z.B. -1 als Fehler verwenden kann:
Wie meinst Du das?
Siehe man -P'less +/RETURN' 3 getchar. fgetc(), getc() and getchar() return the character read as an unsigned char cast to an int or EOF on end of file or error. Wobei EOF != 0..255 ist, also ausserhalb des Wertebereichs von 'unsigned char'. Und genau das ermoeglicht eben, zusaetzlich zum vollen Wertebereich von 'unsigned char' noch einen Wert fuer 'Fehler' bzw. 'Ende' zu haben. z.B. wuerde auch gehen: int c; c = getchar(); switch(c) { case EOF: /* Ende oder Fehler */ break; case 'a': /* ... */ } -dnh -- 153: höflich Abwesenheit von absichtlichen Beleidigungen. (Lars Marowsky-Brée)
Hallo, On Sat, 14 Jun 2003 at 09:50 (+0200), David Haller wrote:
On Fri, 13 Jun 2003, Thorsten Haude wrote:
* David Haller
[2003-06-13 16:55]: fgetc(), getc() and getchar() return the character read as an unsigned char cast to an int or EOF on end of file or error.
An dieser Stelle sollte man vielleicht noch erklaeren, was es hier mit dem EOF auf sich hat. EOF steht fuer `end of file', also Dateiende. Es wird verwendet, um zu erkennen, wann die Datei am Ende ist. Ein Programm, das von der Standardeingabe liest, bekommt ein Dateiende, wenn a) entweder das Programm mit Eingabeumlenkung aufgerufen wird und die Datei am Ende ist, z. B. ./meinprogramm < meinedatei b) man im Terminal Ctrl-d (unter Unix, unter Windows ist es IIRC Ctrl-z) drueckt. Gruss, Bernhard -- _________ http://www.bwalle.de _________________________________________________ Wenn zwei Leute sehr schnell einer Meinung sind, hat wahrscheinlich nur einer über die Sache nachgedacht. -- Lyndon B. Johnson
participants (8)
-
Bernhard Walle
-
Christoph Maurer
-
Daniel Feist
-
David Haller
-
Peter Wiersig
-
Stefan Sassenberg
-
Thorsten Haude
-
Wolfgang Hinsch