Fehler bei Char-Funktion



  • Ich hab nochmal eine Frage...
    Ich lass den Anwender eine Eingabe machen, welche in einer Char-Variable gspeichert wird. Der Anwender muss eine Eingabe zwischen 0 und 3 machen.
    Das klappt ja auch ganz gut, allerdings funktioniert das nicht bei 32 oder 09 oder ieine Zahl, die mir 0-3 beginnt.
    Ich bin mir ja im Klaren, dass es immer nur die erste Ziffer nimmt und überprüft. Aber wie kann ich das Realisieren, dass es diesen Fehler umgeht?

    PS: Ignoriert das fflush(stdin); 🙂

    MfG Global

    /*************************************/
    /**									**/
    /**		menueeinundausgabe()		**/
    /**									**/
    /*#***********************************/
    /*
    Parameter:
      keine
    
    Return:
      (o) menue:	Gibt den Wert zurück, den der Anwender eingibt.
    
    Beschreibung:
      Diese Funktion gibt das Menü auf dem Bildschirm aus.
      Gleich darauf wird der Anwender zu einer Eingabe aufgefordert. Diese muss den ASCII-Wert 48 - 51 haben, 
      ansonsten wird der Anwender erneut gebeten eine Eingabe zu machen.
      Nach einer Eingabe wird der Bildschirminhalt gelöscht, damit bei zu häufigen Eingaben nicht 
      der ganze Bildschirm vollgeschrieben ist.
      Zuletzt wird die Eingabe des Anwender zurückgegeben.
    */
    
    char menueeinundausgabe(){
    	char menue;
    	do{
    	printf("\nKlicken Sie:\n\n0 Beenden\n1 Info\n2 Spieler vs. Spieler\n3 Spieler vs. Computer\n");
    	scanf("%c", &menue);
    	fflush(stdin);
    	system("cls");
    	}
    	while(menue < 48 || menue > 51);
    	return menue;
    }
    


  • Möglichkeit 1: Du fragst die Auswahl als int-Wert ab ( int menue;scanf("%d",&menue); ).
    Möglichkeit 2: Du schaust nach dem scanf()-Aufruf nach, was als nächstes im Eingabepuffer steht (dazu brauchst du einen weiteren scanf() und mußt nachsehen, ob der ein '\n' liefert).

    PS: Nein, das fflush(stdin) ignorieren wir nicht - das wird dir so lange angekreidet, bis du lernst, es nicht mehr zu verwenden.



  • Hmm, also des mit int geht leider net. Außer du zeigst mir ne andere Möglichkeit wie man dan Buchstaben abfängt, falls das der Anwender eingeben will. Bei mir kommt dann immer ne Endlosschleife und des sieht net schick aus.

    Zur Möglichkeit 2 wie überprüf ich denn ob er beim zweiten scanf die zeichenkette abschließt?
    Vorallem wird das überhaupt automatisch abgeschlossen?

    PS(fflush(stdin): Ich will aber meine Note nicht gefärden. Würd ich das Programm für mich schreiben (was ich u.a. auch tue) und es nicht bewertet würde, dann würd ich den anderen Vorschlag gern annehmen und verwenden.

    MfG



  • Möglichkeit:
    Du könntest getche() verwenden;
    Dann bekommst du genau ein Zeichen als eingabe...



  • GlobalDeeJay schrieb:

    Hmm, also des mit int geht leider net.
    ...

    Warum sollte das nicht gehen, du brauchst nur char menue durch int menue
    zu ersetzen und den scanf Befehl wie von CStoll beschrieben anzupassen.



  • Wie fang ich dann Buchstaben und Sonderzeichen ab?
    Also bei mir kommt dann immer ne Endlosschleife...

    MfG



  • Vermutlich musst du noch die while Schleife anpassen ?

    while(menue < 0 || menue > 3)
    


  • Ja wenn du mir sagst wie man sie korrekt anpasst. So dass man wirklich NUR diese 3 Zahlen eingibt und die Schleife weder von Buchstaben noch von Sonderzeichen unterbrochen wird...

    MfG

    Edit: SO hat ichs ja zu Anfang... Eben nur mit do{}while



  • Hm, bei mir wird da nichts unterbrochen:

    int menueeinundausgabe()
    {
    	int menue;
    
    	do
    	{
    
    		printf("\nKlicken Sie:\n\n0 Beenden\n1 Info\n2 Spieler vs. Spieler\n3"
    													" Spieler vs. Computer\n");
    		while ((menue = getchar()) != EOF && menue != '\n');
    
    	    scanf("%d", &menue);
    	    system("cls");
        }
    	while( menue < 0 || menue > 3 );
    
        return menue;
    }
    
    int main()
    {
    	printf("%d\n", menueeinundausgabe());
    	return 0;
    }
    


  • Sorry, hast Recht, das hakt ab und an mal.



  • proggingmania schrieb:

    Sorry, hast Recht, das hakt ab und an mal.

    Ja leider...
    Aber trotzdem danke 🙂



  • Habs nochmal probiert, die Falle bzw. der Haken liegt wohl am Datentypen.
    Wenn menue signed int ist, dann wird es bei der Eingabe eines Zeichens, das keine Zahl ist, negativ.

    int menueeinundausgabe()
    {
        unsigned int menue;
    
        do
        {
           printf("\nKlicken Sie:\n\n0 Beenden\n1 Info\n2 Spieler vs. Spieler\n3"
                                                       " Spieler vs. Computer\n");
    	   fflush(stdin);
    		scanf( "%d", &menue );
            system("cls");
        }
        while( menue < 0 || menue > 3 );
    
        return menue;
    }
    
    int main()
    {
        printf("%d\n", menueeinundausgabe());
        return 0;
    }
    

    So dürfte es nu funzen 🙂



  • k:\backup\thomas\schule\test\test.cpp(23) : fatal error C1010: Unerwartetes Dateiende waehrend der Suche nach der Direktive fuer die vorkompilierte Header-Datei

    Ähhhhhh, was bedeutet des? Ich hab nur den Code von dir mal in den Compiler reingeschmissen. Also die Klammern stimmen.
    Aber mal so: Auf Buchstaben reagiert es doch immernoch mit ner Endlosschleife oder?

    Edit:
    Oki, vergess es... Hab die Header ja garnich included *schäm*



  • Cool, des funktioniert sogar... daaaaaaaaanke...
    Aber tust mir noch nen Gefallen und sagst mir warum des jetzt auf einmal geht?
    *lieb frag*



  • Buchstaben werden quasi ingoriert und es wird weiter abgefragt.
    Also quasi ist das ne Endlosschleife, bis eine Zahl von 0 bis 3 eingegeben wird.



  • Unerwartetes Dateiende waehrend der Suche nach der Direktive fuer die vorkompilierte Header-Datei ...
    Das ist Visual Studio Standardeinstellung.
    Kannst du bei Projekt/Einstellungen/C++/Vorkompilierte Header
    deaktivieren durch setzen des entsprechenden Radio Buttons einstellen.



  • proggingmania schrieb:

    Buchstaben werden quasi ingoriert und es wird weiter abgefragt.
    Also quasi ist das ne Endlosschleife, bis eine Zahl von 0 bis 3 eingegeben wird.

    Des versteh ich schon. Aber ich schwöre bei Gott, ich hatte des mal so ähnlich, auch die Eingabe über integer und die Abfrage obs denn auch die Zahlen sind. Und als ich zum Beispiel a eingegeben hatte kam die Endlosschleife... warum ach immer.
    Des irritiert mich jetzt n bissl. Aber trotzdem danke 🙂

    Kannst du bei Projekt/Einstellungen/C++/Vorkompilierte Header
    deaktivieren durch setzen des entsprechenden Radio Buttons einstellen.

    Ähm... Bringt mir des einen Vorteil? Wenn der doch merkt dass ne header fehlt dann funzt des Prog doch eh net korrekt oder?



  • GlobalDeeJay schrieb:

    Cool, des funktioniert sogar... daaaaaaaaanke...
    Aber tust mir noch nen Gefallen und sagst mir warum des jetzt auf einmal geht?
    *lieb frag*

    Tja, das frage ich mich auch gerade.



  • Tja, das frage ich mich auch gerade.

    Hmm...Schau mal in die Zeile 9 deines letzten Codes... CStoll wird dich dafür hassen *gg*
    Naja, aber wie heißt? Don't change a running System, dann lass ma des bei Code einfach auch so 🙂
    Soll ja recht sein wenns funzt, wenn du rausfindest wieso wärs toll. Ich gebs auf. Zu viel Codes am Morgen :S



  • proggingmania schrieb:

    GlobalDeeJay schrieb:

    Cool, des funktioniert sogar... daaaaaaaaanke...
    Aber tust mir noch nen Gefallen und sagst mir warum des jetzt auf einmal geht?
    *lieb frag*

    Tja, das frage ich mich auch gerade.

    bestimmts liegt's am 'fflush(stdin)' --> undefiniertes verhalten.


Anmelden zum Antworten