Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » switch fehler?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
17.12.2007, 18:12 Uhr
wolf360




C++:
#include <stdio.h>
#include <stdlib.h>
int main(void){
    FILE *datei;
    float aktuell,ausgaben[255],neu;
    char auswahl;
    int i,i2,a,a2;
    
    datei = fopen("C:\\programme\\Eigene Dateien\\test.txt","r+");
    
    printf("Beenden mit e\n");
    
    printf("\t-1- Einnahmen\n");
    printf("\t-2- Ausgaben\n");
    printf("\t-3- Aktueller Kontostand\n");
    do{
                  
    printf("Auswahl ");    
    scanf("%c",&auswahl);
        switch(auswahl){
                        case '1': printf("kommt noch\n");
                           break;
                        case '2':
                             rewind(datei);
                             fscanf(datei,"%f",&aktuell);
                               printf("Ausgaben: \n");
                               printf("Eingabe Beenden mit e\n");

                                for(i=1,a2=0; getchar() != 'e';i++,a2++){
                                       printf("\t%d. Preis: ",i);            
                                       scanf("%f",&ausgaben[i]);
                                       a= a2;
                                       }          
                                for(i2=1,a; i2<=a; i2++){
                                       neu=aktuell-ausgaben[i2];
                                       aktuell = neu;
                                }
                                      rewind(datei);
                                     fprintf(datei,"%f",aktuell);                                    
                                      
                           break;  
                          
                        case '3': fscanf(datei,"%f",&aktuell);
                                   printf("%f Euro\n",aktuell);
                        break;  
                        case 'e': continue;    
                        break;                    
                        
                        default: printf("Falsche Auswahl\n");
                        break;
                        }  
                        
               }
               while(auswahl != 'e');                                    
          
      
    system("Pause");
    getchar();
    }



es funktioniert alles 1a bis auf das er bei einer falschen Eingabe oder nach einem ausgeführten Case fall erst Auswahl und dann die default Anweißung ausgibt?! Anstatt einfach nur Auwahl auszugeben?

wo ist mein Fehler?

gruß wolf360
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
17.12.2007, 19:00 Uhr
Th



Da steht noch ein Zeilenende-Zeichen im Tastaturbuffer (bzw. weitere Eingaben).
Am besten leere nach der Eingabe noch den Puffer mit:

C++:
while(getchar() != '\n');


Bei der Eingabe "12" würde in deinem Fall zuerst 1 und dann 2 abgearbeitet werden.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
17.12.2007, 19:33 Uhr
Hans
Library Walker
(Operator)


Hi,

das Problem hängt mit der Eingabepufferung zusammen. Du liesst mit scanf ja nur ein Zeichen ein. Aber bevor Dein Programm das Zeichen auswerten kann, musst Du die <Return> oder <Enter>-Taste drücken. Dadurch gelangt ein weiteres Zeichen, nämlich '\n' in den Eingabepuffer, bzw. Eingabestream. Wenn das Programm jetzt mit der Berarbeitung des switch-blocks fertig ist, wird die Abbruchbedingnung der Schleife überprüft. Da diese nicht zutrift, läuft es wieder in die scanf-anweisung rein. scanf liest da jetzt das '\n' aus, das in den default-Zweig der switch-anweisung führt.
Die Lösung des Problems besteht darin, den Eingabepuffer, oder Eingabestream zu leeren. Dazu schreibst Du hinter der scanf-Anweisung

C++:
fflush (stdin);


Damit wird der Eingabestream geleert, was in diesem Fall bedeutet, dass das '\n', das da noch drin steht, verworfen wird.
(@Beefy: Alles richtig, oder hab ich was vergessen? )

Dann noch ein paar Kleinigkeiten:
Im zweiten case-Zweig, also case '2' in der zweiten for-schleife steht:

C++:
for (i2=1,a; i2<=a; i2++)


Da muss mit dem a noch irgendwas passieren, sonst kracht es früher oder später.

Vor dem Beenden des Programms solltest Du die benutzte Datei noch schliessen, und weil main ja was zurück geben soll, musst Du es auch was zurückgeben lassen. Das heisst also, das Du das hier noch einfügen solltest:

C++:
   fclose (datei);
   return 0;



Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
17.12.2007, 20:05 Uhr
wolf360



okey so was genau bzw wie mus ich mir den Puffer vorstellen? warum bleibt z.B. immernur das newline zeichen im puffer???
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
17.12.2007, 20:32 Uhr
0xdeadbeef
Gott
(Operator)



C++:
fflush(stdin);


erzeugt undefiniertes Verhalten. fflush ist - logischerweise - nur auf Ausgabeströmen definiert. Th's Lösung ist allemal besser, ich für meinen Teil würde die Eingaben gleich zeilenweise verarbeiten, wie in www.fun-soft.de/showtopic.php?threadid=18951 beschrieben.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
17.12.2007, 20:48 Uhr
Hans
Library Walker
(Operator)


Hi,

so einen Puffer kann man in etwa mit einer Warteschlange an der Kasse vom Supermarkt oder vor dem Kino vergleichen. Nehmen wir mal das Kino. Bevor Du einen Film angucken kannst, musst Du eine Eintrittskarte kaufen. Da Du nicht der Einzige bist, der eine Karte haben will, musst Du warten, bis die Leute, die vor Dir da waren, ihre Karten haben. Du stehst dann solange in einer Warteschlange, bis Du an dran kommst. Und so wie Du an der Kinokasse in der Warteschlange stehst, so stehen die Zeichen, die man über die Tastatur eingibt, ebenfalls in einer Warteschlange, bevor sie von einem Programm verarbeitet werden. Nur das man die Warteschlange in diesem Fall halt Eingabepuffer oder Eingabestream nennt.

Du kannst mit Deiner ursprünglichen Version des Programms ja mal einen Test machen: gib nach dem Start einfach mal 99999 ein. Du erhälst dan 6 mal die Meldung, das Du eine falsche Eingabe gemacht hast. Fünf mal für die '9' und einmal für das '\n'.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
17.12.2007, 20:57 Uhr
Hans
Library Walker
(Operator)



Zitat von 0xdeadbeef:

C++:
fflush(stdin);


erzeugt undefiniertes Verhalten. fflush ist - logischerweise - nur auf Ausgabeströmen definiert. Th's Lösung ist allemal besser, ich für meinen Teil würde die Eingaben gleich zeilenweise verarbeiten, wie in www.fun-soft.de/showtopic.php?threadid=18951 beschrieben.

Ich wusste doch, da war noch was...
Dann ist fflush(stdin); dieses berüchtigte Windoof-spezifikum.

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
18.12.2007, 14:46 Uhr
wolf360



ja abba des wurde doch schon verarbeitet???

des is ja des was ich nicht versteh?

wenn ich enter drück entspricht das ja z.B. newline-\n?


aaaaaachso etza..... der speichert das scanf speicher durch das enter-drücken newline mit?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
18.12.2007, 16:07 Uhr
Hans
Library Walker
(Operator)


Hi,

Du hast in deinem Programm doch

C++:
scanf("%c",&auswahl);


geschrieben. Das bedeutet, das genau ein Zeichen gelesen und verarbeitet wird.
Wenn Du jetzt aber was eingibst musst Du ja mindestens 2 Tasten drücken, einmal die Taste für den ausgewählten Menüpunkt, also '1' oder '2' oder so was, und die Enter-Taste. Das ergibt zwei Zeichen, die in die beschriebene Warteschlange wandern, denn die Enter-Taste produziert das newline-Zeichen '\n'.
Dein Programm liesst in der Schleife aber erst mal nur ein Zeichen, und rechnet irgendwas. Wenn die Schleife dann das nächste mal durchläuft, liesst das Programm das nächste Zeichen, und das ist das newline-zeichen '\n'. Das ergibt dann die Ausgabe: "Falsche Auswahl".

Hans
--
Man muss nicht alles wissen, aber man sollte wissen, wo es steht. Zum Beispiel hier: Nachdenkseiten oder Infoportal Globalisierung.

Dieser Post wurde am 18.12.2007 um 16:13 Uhr von Hans editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
18.12.2007, 18:40 Uhr
wolf360



jope genau so in der art hab ichs gemeint!!

danke für die hilfe!

gruß´wolf360
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: