C - perfect reading char



  • Hallo zusammen
    Ich bin C beginner und schreibe an einem billetautomaten als übung.
    ich habe unten die funktion readChar abgebildet.
    Ziel ist es, nur die eingabe s, l ,c oder x zuzulassen und alles andere abzulehnen.
    jetzt, meine probleme damit:
    1.) da ich in der ersten if-clause nur werte mit anzahl stellen = 1 zuslasse, muss ich das ablehnen (--> your input was not valid etc) doppelt programmieren, wie könnte ich die ganze funktion umschreiben um dies zu vermeiden??
    2.) gebe ich nun den wert zb 'q' ein, also einstellig und nicht möglich, geht er in den switch default und bleibt da hänbgen, bis ich mit 'enter' bestätige, und dann wiederholt er den loop. gebe ich aber zb 'qqq' ein, also dreistellig und falsch, geht er ja in die else rein und wiederholt den loop ohne eine eingabe von 'enter'. wieso also bleibt er mir im switch hängen? fehler??

    //****************************************************************
    // readChar function
    //****************************************************************
    char readChar() {
    	// readChar variables
    	char letter;  // typed value
    	int loop = 1; // helper for loop
    	// endless loop until correct character input
    	do {
    		// choose between given options
    		// TAKE OPTIONS OUT OF THE LOOP!!
    		printf("Please choose between the following options:\n\n");
    		printf("    [s] short distance ticket\n");
    		printf("    [l] long distance ticket\n");
    		printf("    [c] cancel (return home)\n"); // NOT NESSESARY OPTION
    		printf("    [x] exit (shut program down)\n\n");
    		// read the character
    		if(scanf("%c", &letter) == 1 && getchar() == '\n') {
                // check the character
    			switch(letter) {
    				case 's':
    					loop = 0;
    					break;
    				case 'l':
    					loop = 0;
    					break;
    				case 'c':
    					loop = 0;
    					break;
    				case 'x':
    					loop = 0;
    					break;
    				default: // if letter was not one of the options
    					printf("Your input was not valid, press 'enter' key to continue\n\n");
    					while (getchar() != '\n') { // empty the buffer
    						;
    					}
    					//break;
    			} // end of switch(letter)
    		} else { // if letter was bigger than 1 char or an int value
                printf("Your input was not valid, press 'enter' key to continue\n\n");
                while (getchar() != '\n') { // empty the buffer
                    ;
    			} // end of while(getchar)
            } // end of else
    	} while (loop == 1);
    	printf("\nYour choice [%c] has been accepted, the program is moving on.\n\n", letter);
    
    	return letter;
    }
    


  • 2.) weil bei der eingabe von "qqq"+enter , das '\n' ja noch im buffer steht.



  • ja aber das is ja im switch genau dasselbe nicht?



  • Das switch hat damit nichts zu tun.

    Annahme: Du gibst qrs ein und bestätigst das mit der Entertaste.

    Beim scanf (Zeile 18) landet das 'q' in letter und das 'r' wird vom getchar() gelesen (und verworfen).
    Die Bedingung vom if ist unwahr, also wird der else-Zweig abgearbeitet.
    Das while liest halt alles bis zum nächsten \n ein: Das 's' und das '\n'.



  • ja aber war umgekehrt.
    hatte bei zb q nochmals enter drücken müssen und bei qqq nicht.
    hab den fehler jedenfalls gefunden, ich leere den buffer in der if clause (defalt) doppelt, daher das enter nochmals.
    danke trotzdem


Anmelden zum Antworten