Nach scanf hängt Programm! Versteh net warum



  • Hi. Bin momentan dabei ein Programm zu basteln was mir Binäre Zahlen addiert. Mit Signed, Unsigned etc. So wie es in einer CPU auch gemacht wird. Nur leider bin ich noch net sehr weit. Das Programm hängt sich nämlich nach der ersten und bis jetzt einzigen scanf-Funktion auf und ich versteh überhaupt nicht warum. Beim Kompilieren gibts keine Fehlermeldung und auch keine Warnung. Läuft also sauber durch. Vielleicht seht ihr was:

    #include <stdio.h>
    
    int main (void)
        {
        printf ("Dieses Programm dient dazu die Rechnungen einer CPU zu simulieren\n" );
        printf ("Was wollen sie machen?  ");
        printf ("a=Addieren, s=Subtrahieren  ");
    
        int iOperand;
        iOperand = getchar();
    
        int iBit;
    
        printf ("Um was fuer eine CPU handelt es sich 8, 16 oder 32 Bit?: ");
        scanf  (" %d ", & iBit);
    
        printf (" %d ", iOperand);
        return 0;
        }
    

    Nach dem scanf passiert nichts mehr. Die Ausgabe vom letzten printf sieht mal also nicht. Wenn ich scanf rausnehme gehts. Hab den Code mit Code::Blocks und Dev-C++ ausprobiert. Bei beidem das selbe. Auch zwei verschiedene Compiler brachten nix 😞 Also ich sehe keinen Fehler! Ihr?

    mfg Alex



  • zweites scanf hat keinen pointer bekommen.



  • Sorry aber das vesteh ich net. In der Technikerschule haben wir noch keine Pointer durchgenommen. Wir haben alles immer so Programmiert wie ich gerade auch und es hat auch alles funktioniert. Warum jetzt in diesem Fall nicht?

    Sowie ich Pointer verstehe enthält er nur die Adresse der Variable. Das Programm muss doch selber wissen wo er die Variable erstellt hat sonst hätten ja alle Programme die ich bis jetzt gemacht habe net funktionieren können.

    Kann mich da einer aufklären?



  • edit: oops mein fehler. ich sehs mir nochmal genauer an.

    edit2: im formatstring deines scanf sind die leerzeichen das problem. lass sie weg. warum hast du da ueberhaupt leerzeichen reingemacht?



  • AlexDozer schrieb:

    Sorry aber das vesteh ich net. In der Technikerschule haben wir noch keine Pointer durchgenommen. Wir haben alles immer so Programmiert wie ich gerade auch und es hat auch alles funktioniert. Warum jetzt in diesem Fall nicht?

    Nur so, hat nichts mit deinem Problem zu tun: Das &iBit, was du da bei scanf übergibst, ist bereits ein Pointer, der auf iBit zeigt. Sonst wüßte scanf nicht, wohin es die eingelesenen Daten speichern soll. Allgemein bekommt man mit dem einstelligen &-Operator einen Pointer auf die jeweilige Variable.



  • @Bashar: Danke für den Hinweis!

    Ich nehme mal das keiner von euch nen Fehler sieht sonst hätte wahrscheinlich jemand geantwortet. Könnten sich welche von euch erbarmen und den Code mal bei sich ausprobieren? Und falls es funktionieren sollte mir mitteilen welche Entwicklungsumgebung er benutzt?

    mfg Alex



  • AlexDozer schrieb:

    Ich nehme mal das keiner von euch nen Fehler sieht sonst hätte wahrscheinlich jemand geantwortet.

    c.rackwitz schrieb:

    im formatstring deines scanf sind die leerzeichen das problem. lass sie weg. warum hast du da ueberhaupt leerzeichen reingemacht?



  • in deinem scanf-formatstring sind die leerzeichen zu viel. mach sie weg.

    GCC/MinGW

    edit: jetz bin ich doch tatsaechlich zu lahm fuer mich 😉



  • Vielen Dank Leute. Warum ich die Leerzeichen reingemacht habe weis ich auch nicht so genau. Ich denke weils besser aussieht 🙂 Ich hätte den Fehler aber nicht gefunden muss ich zugeben. Naja bin halt noch ein Anfänger 🙄

    mfg Alex



  • c.rackwitz schrieb:

    in deinem scanf-formatstring sind die leerzeichen zu viel. mach sie weg.

    Genaugenommen stört nur das Leerzeichen nach dem '%d'. Das vorne stehende Leerzeichen frißt einfach alle Whitespaces auf, auch 0, wenn gerade keine da sind (und ist in diesem Fall überflüssig, aber nicht falsch).



  • Ich muss euch nochmal nerven. Ich hab mein Programm weiter geschrieben und komme jetzt schon wieder net weiter 😞 Diesmal hab ich das Problem das manche Befehle einfach nicht ausgeführt werden. Hier mal mein Code:

    #include <stdio.h>
    
    int main (void)
        {
        int iBit1[8];
        int iBit2[8];
    
        printf ("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n");
        printf ("+ Dieses Programm dient dazu die Rechnungen einer CPU zu simulieren! +\n");
        printf ("++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\n\n");
    
        printf ("Bitte geben sie die erste Dualzahl ein: ");
        scanf  ("%d%d%d%d%d%d%d%d",&iBit1[0],&iBit1[1],&iBit1[2],&iBit1[3],&iBit1[4],&iBit1[5],&iBit1[6],&iBit1[7]);
        printf ("-------------------------------------------------------\n\n");
    
        printf ("Nun bitte die zweite Zahl eingeben: ");
        scanf  ("%d%d%d%d%d%d%d%d",&iBit2[0],&iBit2[1],&iBit2[2],&iBit2[3],&iBit2[4],&iBit2[5],&iBit2[6],&iBit2[7]);
        printf ("-------------------------------------------------------\n\n");
    
        printf ("Sind die Zahlen Vorzeichenbehaftet? s=Signed u=Unsigned:");
        int iVorzeichen;           
        iVorzeichen = getchar();  //Das hier wird nicht ausgeführt!
    
    	return 0;
    
        }
    

    Nach dem letzten printf wird das Programm einfach beendet. Aber normalerweise müsste er hier noch ein Zeichen einlesen. Aber das macht er einfach nicht. Nach printf ist das Programm beendet.

    Ich habs auch schon damit probiert:

    scanf ("%d", &iVorzeichen);
    

    oder mit

    char cVorzeichen;
    scanf ("%c", &cVorzeichen);
    

    Aber er macht das immer net und ich seh wieder mal keinen Fehler 😞 Ich wollte jetzt nicht nochmal nen Extra-Thread aufmachen deswegen hab ich es hier rein!

    mfg Alex



  • vielleicht liegen noch sachen im eingabepuffer und deshalb wird getchar()
    "übersprungen".
    wenns daran liegt, dann schau mal in die faq



  • Durch deinen Hinweis bin ich jetzt mittlerweile bisschen schlauer. Ich hab die ersten 2 scanf-Funktionen auskommentiert. Jetzt gehts. Anscheinend ist wirklich nach der Eingabe der Dualzahlen noch was im Eingabepuffer.

    mfg Alex

    edit: Gibts eine Möglichkeit den Eingabepuffer durch Befehl zu löschen?

    edit2: Ja geht mit fflush(stdin);



  • AlexDozer schrieb:

    edit2: Ja geht mit fflush(stdin);

    😡 http://www.c-plusplus.net/forum/viewtopic-var-t-is-39349.html



  • Hallo,

    AlexDozer schrieb:

    edit: Gibts eine Möglichkeit den Eingabepuffer durch Befehl zu löschen?

    du kannst

    while (getchar()!='\n');
    

    nach deinen scanfs einbauen. Das zieht den Rest aus dem stdin raus. Dass fflush(stdin) keine gute Idee ist, wurde ja schon gesagt.

    Mfg

    GPC



  • Das mit dem fflush(stdin) scheint keine gute Lösung zu sein 😮

    Dann gewöhn ich mir am besten gleich an immer die Schleife zu verwenden. Vielen Dank! Echt cooles Forum hier!



  • so ists besser:
    int c; while ((c = getchar()) != EOF && c != '\n');

    es muss ein int sein und das EOF muss geprueft werden.


Anmelden zum Antworten