scanf, getchar() und char



  • Hallo,

    ich möchte mit scanf() ein Zeichen einlesen. Sollte ein falsches Zeichen eingegeben worden sein, so soll der Benutzer nochmals zur Eingabe aufgefordert werden. Hier mein Code:

    #include <stdio.h>
    #include <stdlib.h>
    
    short eingabe_operator(void){
        char c;
    	short z = 1;
    	c = getchar();
    	while (c != '\n'){
            if (c != '+' || c != '-'){
                 z = 0;
            }
    		c = getchar();
        }
    	return z;
    }
    
    int main(){
        char operation;
        short t=1;
        while(t){
                printf("\nOperation:");
                scanf("%c", &operation);
                if(eingabe_operator()){
                    break;
                }
                else
                    printf("\nKeine gueltige Operation eingegeben!");
            }
    return 0;
    }
    

    Das Problem: Es funktioniert nicht (haha). Es funktioniert ohne Probleme für integer oder double, aber nicht für char. Das erste Zeichen, was von getchar() an c gegeben wird, ist ein LF (ASCII #10). Das verstehe ich nicht, ich habe doch noch gar nicht ENTER gedrückt. Gebe ich aber z.Bsp. ein ß ein (außerhalb der standard ASCII Tabelle), funktioniert es.
    Compiliert habe ich das ganze sowohl mit GCC unter Linux, als auch mit VisualStudio10 unter Windows.

    Mich interessiert dabei, wieso das erste Zeichen bei char ein LF ist, wieso es bei int/double ohne Probleme funktioniert und wie ich das ganze beheben könnte (dabei aber bitte nicht 'nimm doch einfach x y, oder mach das mit x y', es sei denn, es ist mit scanf() einfach nicht mgl). Nach scanf() und getchar() hab ich schon gesucht und mich belesen, finde aber anscheinend nicht den Haken an der Sache.


  • Mod

    Das klingt so, als würdest du dein Programm über eine Tastatur steuern. Beschreib mal genau, in welcher Reihenfolge du welche Tasten drückst, welches Verhalten du erwartest und was stattdessen passiert.



  • Jau, die Eingabe soll über die Tastatur erfolgen. Also:
    Nach Programmstart soll entweder + oder - eingegeben werden, gefolgt von Enter. Ist dies der Fall, soll das Programm fortfahren, also aus der while-Schleife ausbrechen. Wird jedoch etwas anderes eingeben, also 4 oder r oder ü oder sonstirgendwas gefolgt von Enter, soll eben 'Keine gültige OP eingegeben' erscheinen.
    Passieren tut folgendes: gibt man ein einzelndes Zeichen gefolgt von Enter ein, egal welches, wird aus der Schleife ausgebrochen, gerade so, als ob die richtige Eingabe erfolgt sei. Gibt man aber zwei oder mehr Zeichen ein, erfolgt der gewünschte Effekt, also die Aufforderung auf eine Neueingabe.
    Ich habe mir mal den Parameter c der Funktion eingabe_operator mit printf ausgeben lassen. Gibt man ein einzelnes Zeichen ein, ist es LF (also der Zeilenvorschub), sind es mehrere Zeichen, so ist es das zweite Zeichen.



  • Das scanf("%c" liest das gewünschte Zeichen ein (operation) und nimmt es aus dem Eingabestrom. Das '\n' von der Entertaste bleibt aber im Eingabestrom.
    Das wird dann von dem getchar gelesen.
    An dieser Stelle kommst du aber nicht mehr an das Zeichen von Operation heran.
    Von daher ist deine Funktion eingabe_operator etwas nutzlos.

    Wenn du das getchar du ein scanf("%d" ersetzt hast, und es da geklappt hat, dann solltest du wissen das scanf i.A. Whitespace (Leerzeichen, Tabulatoren, '\n', '\r') überliest (nicht aber bei %c)*.

    Was möchtest du denn erreichen mit deinen Funktionen?

    *Du kannst scanf mit einem Leerzeichen im Formatstring zum überlesen von Whiteaspace "überreden"


Anmelden zum Antworten