scanf_s funktioniert nicht richtig



  • Ich will mit scanf_s eine Option einlesen:

    char myOption;
    	printf("Enter Option (y/n): ");
    	scanf_s("%c", &myOption, 1);
    

    Das klappt auch ganz prima.

    Jetzt will ich weiterhin eine Rechenoperation op einlesen:

    void main()
    {
    
    	int zahl1, zahl2, erg = 0;
    	char op;
    	int dummy;
    
    	char myOption;
    	printf("Enter Option (y/n): ");
    	scanf_s("%c", &myOption, 1);
    
    	printf("1. Zahl eingeben: ");
    	scanf_s("%i", &zahl1);
    
    	printf("2. Zahl eingeben: ");
    	scanf_s("%i", &zahl2);
    
    	printf("Rechenoperation eingeben (+, -, *, /) : ");
    	scanf_s("%c", &op, 1);
    	...
    

    Das Einlesen von zahl1 und zahl2 klappt ... aber das Einlesen von op funktioniert nicht mehr!

    Die Anwendung rennt jetzt über die Anweisung

    scanf_s("%c", &op, 1);

    einfach hinweg, d.h. ich kann nichts eingeben. Und natürlich ist dann die Variable op nicht richtig befüllt.

    Was mache ich da denn falsch ?

    LG

    P.S.:

    Es sieht so aus, als müsste, das scanf_s irgendwie abgeschlossen werden.

    void main()
    {
    
    	int zahl1, zahl2, erg = 0;
    	char op;
    	int dummy;
    
    	char myOption;
    
    	printf("1. Zahl eingeben: ");
    	scanf_s("%i", &zahl1);
    
    	printf("2. Zahl eingeben: ");
    	scanf_s("%i", &zahl2);
    
    	printf("\nRechenoperation eingeben1: ");
    	scanf_s("%c", &op, 1);
    	printf("\nRechenoperation eingeben2: ");
    	scanf_s("%c", &op, 1);
    
    	printf("\n%i %c %i\n ", zahl1, op, zahl2);
            ...
    

    Rechenoperation1 eingeben1:

    wird überlesen.

    Aber

    Rechenoperation eingeben2:

    funktioniert dann wieder richtig. Irgendwie fehlt mir da eine wichtige Information zum scanf_s ...



  • Einfach ein Leerzeichen vorher einfügen (dieses sorgt dafür, daß Whitespaces überlesen werden - das NewLine-Zeichen ist bei deinem Programm noch im Tastaturpuffer):

    scanf_s(" %c", &op, 1);
    


  • Supi, so funktioniert das jetzt. Herzlichen Dank für deine unendliche Geduld!

    Nun hab ich noch ein kleines Problem. Das DOS Fenster schließt sich, sobald die Anwendung das Ende erreicht. Deshalb möchte ich gern "Continue ..." ausgeben und darauf warten, dass der Anwender die Eingabetaste drückt.

    char dummy;
            printf("Continue ... ");
    	scanf_s(" %c", &dummy, 0);
    

    Das funzt leider nicht so ganz wie ich mir das vorstelle ... die Message "Continue ..." erscheint zwar ... aber wenn ich dann nur die Eingabetaste drücke bleibt die Anwendung immer noch im "scanf_s" Prompt hängen. Erst wenn ich mindestens EIN Zeichen eingebe, kann ich die Anwendung beenden.

    Wie mache ich das denn richtig? Ich hoffe, ich habe mein Anliegen verständlich machen können

    LG



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum C (alle ISO-Standards) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Peter329 schrieb:

    ... aber wenn ich dann nur die Eingabetaste drücke bleibt die Anwendung immer noch im "scanf_s" Prompt hängen. Erst wenn ich mindestens EIN Zeichen eingebe, kann ich die Anwendung beenden.

    Das entspricht genau dem Verhalten für diesen Formatstring.

    Peter329 schrieb:

    Wie mache ich das denn richtig? Ich hoffe, ich habe mein Anliegen verständlich machen können

    Indem du das Programm in einer offenen Konsole startest.
    Schließlich ist es ein Konsolenprogramm.

    Der Anfängerweg:
    Du musst erstmal alle Zeichen aus dem Eingabestrom lesen, oder löschen.
    Das ist mit Standard-C schwierig.

    Aber du kannst zumindest bis zum nächsten Newline lesen: https://www.c-plusplus.net/forum/p1146014#1146014

    Das Ganze dann vor dem continue scanf und das Leerzeichen muss dann aber wieder aus dem Formatstring raus.
    Allerdings ist scanf da auch übertrieben, denn ein getchar(); reicht.

    In manchen IDE kann man auch einstellen, dass das Konsolenfenster offen bleibt (beim Start aus der IDE heraus)



  • Also erst mal vielen Dank für deine Antwort.

    Mir scheint, das Lesen mit scanf_s oder mit cout << ... ist schon ein bissl hakelig. Aber gut ... die Konsolanwendung ist ja auch nur zum Testen und Lernen und von daher komm ich damit jetzt schon klar.

    Die Idee mit dem Offenhalten der Konsole gefällt mir sehr gut. Ich benutze Visual Studio 2015 ... jetzt hab ich schon eine ganze Weile gesucht, wo man das einstellen kann ... Ist meine Mühe vielleicht vergebens, weil man das in dieser IDE gar nicht einstellen kann ? Oder finde ich das einfach nicht ?

    LG



  • Das sollte auch dort noch gehen mit "Start Without Debugging" s. Start Debugging vs. Start Without Debugging

    PS: Lesen geht in C++ mit "cin" (nicht "cout" 😉



  • Peter329 schrieb:

    Die Idee mit dem Offenhalten der Konsole gefällt mir sehr gut. Ich benutze Visual Studio 2015 ... jetzt hab ich schon eine ganze Weile gesucht, wo man das einstellen kann ...

    Mach einfach eine eigene Konsole, unabhängig von VS, auf!



  • Zum Offenhalten einer von der IDE geöffneten Konsole, ist es üblicherweise erfoderlich, dass das Programm nicht beendet wird. Das kann man auf verschiedene Arten erreichen.

    Im Extremfall ein "while(1);" am Ende. 😃



  • Das ist die beste Idee ever ... eine busy-Schleife, einfach so ... und wenn das Programm dann mal fertig ist, dann ist es immer noch nicht fertig, weil da solche Krücken drin sind ...

    Es scheinen manche Leute wirklich zu dämlich zu sein, eine Konsole zu öffnen, anders ist es doch kaum zu erklären, mit welchen Verrenkungen manche versuchen, ein Programm daran zu hindern, zu Ende zu laufen 😕



  • Belli schrieb:

    Es scheinen manche Leute wirklich zu dämlich zu sein, eine Konsole zu öffnen, anders ist es doch kaum zu erklären, mit welchen Verrenkungen manche versuchen, ein Programm daran zu hindern, zu Ende zu laufen 😕

    Es hat ihnen halt noch keiner gezeigt.
    Klicki-Bunti-Syndrom.



  • Belli schrieb:

    Das ist die beste Idee ever ... eine busy-Schleife, einfach so ... und wenn das Programm dann mal fertig ist, dann ist es immer noch nicht fertig, weil da solche Krücken drin sind ...

    Diese Krücke kommt an eine zentrale Stelle, z.B. in eine Funktion namens "wait4e4()" und dann ist alles wieder ok. 🙂



  • DirkB schrieb:

    Belli schrieb:

    Es scheinen manche Leute wirklich zu dämlich zu sein, eine Konsole zu öffnen, anders ist es doch kaum zu erklären, mit welchen Verrenkungen manche versuchen, ein Programm daran zu hindern, zu Ende zu laufen 😕

    Es hat ihnen halt noch keiner gezeigt.
    Klicki-Bunti-Syndrom.

    Bei den richtigen KlickiBuntis tut sich kein ConsoleWindow mehr auf, sondern die kriegen stdin/stdout in ein Child-Windows ihrer IDE geliefert. 🙂


Anmelden zum Antworten