Problem mit scanf und anschließender Ausgabe



  • Hallo liebe Community,
    Ich bin wirklich noch ganz am Anfang von C.
    Momentan versuche ich ein sehr einfaches Programm zu schreiben das es ermöglicht sein Geburtsdatum einzugeben. Anschließend soll man dann das heutige Datum eingeben. Was das Programm am Ende können soll ist einfach: es rechnet die Jahre, Monate, Wochen, Tage, Stunden, Minuten und Sekunden aus die man schon verlebt hat.

    Dies ist mein aller erstes eigenes Programm und ich bleibe schon sehr, sehr früh stecken. Was für mich logisch erscheint ist das ich zu ersteinmal dass Geburtsdatum des Benutzers abfragen muss. Da fängt für mich der Schlamassel schon an 🙄 . Ich geb euch einfach mal den Code den ich bis jetzt habe :

    #include <cstdlib>
    #include <iostream>
    
    using namespace std;
    
    int main(int argc, char *argv[])
    {
        short Geburtstag;
        short Geburtsmonat;
        short Geburtsjahr;
    
        printf("Hallo, diese Programm wird deine Lebenszeit ermitteln.\n\n");
        printf("Gib als erstes bitte deinen Tag der Geburt an:");
        scanf("%d",&Geburtstag);
    
        getchar();
    
        printf("Gib als n\x84chstes bitte den Monat an:");
        scanf("%d",&Geburtsmonat);
    
        getchar();
    
        printf("gib bitte ein welches dein GeburtsJahr ist:");
        scanf("%ld",&Geburtsjahr);
    
        getchar();
    
        printf("Du bist also am %d . %d . %ld geboren ?",Geburtstag ,Geburtsmonat 
        ,Geburtsjahr);
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    

    Ich hoffe das ist nicht zu lang oder sonst irgendwas und ja ich weiß das ä funktioniert noch nicht wie es soll und schön ist der Code auch nicht gerade.

    Aber zu meinem eigentlichen Problem: Die ersten beiden Variablen Geburtstag und Geburtsmonat werden immer zu 0 nur das Geburtsjahr wird am Ende auch wirklich ausgegeben. Ich habe mich auch schon etwas belesen und es wurde empfohlen das getchar(); mit fflush(stdin); auszutauschen, doch leider erzielte auch das nicht den gewünschten Effekt 😡 .

    Also was mache ich falsch, bitte helft mir weiter.

    ~edit durch SeppJ: Codetags korrigiert~



  • Mach einfach das getchar() weg.



  • ja hab ich gemacht aber das Problem besteht weiterhin wenn ich mein Geburtsdatum 14.01.1993 eingebe kommt weiterhin am Ende 0.0.1993 raus



  • Das Geburtsdatum kannst du auch mit einem scanf Befehl komplett abfragen.
    Schau dir dafür mal dieses Tutorial bei dem Punkt "Einlesen mit Eingabeformatierung" an: http://www.c-howto.de/tutorial-benutzerinteraktion-tastatureingaben.html
    Das Datum solltest du auch wohl auch lieber in int Variablen speichern und nicht in short Variablen. 🙂

    EDIT:
    Außerdem solltest du auch die Entertaste abfangen. Die wird sonst im Tastaturpuffer abgelegt und macht dir das Leben schwer.
    Du machst das wie folgt:

    char temp;
    scanf("%d%c",&Geburtstag,&temp);
    


  • Danke das Hilft mir schonmal sehr. Trotzdem bin ich neuegirig warum die Werte nicht an die Variabeln übermittelt werden bzw. wieder gelöscht werden.



  • Ichvermute, dass dir die Entertaste da Querhaut (siehe mein editierter Post).
    Sicher bin ich mir aber auch nicht. Bin selbst noch Anfänger. 😃



  • Danke vielmals für die schnelle Hilfe. Ich hoffe das der Rest halbwegs rund läuft.


  • Mod

    Hallo MagnumOpus,

    willkommen im Forum.

    Benutze bitte die Codetags korrekt, sonst liest sich niemand deinen Code durch. Benutze die Vorschau vorm Absenden, um zu prüfen, ob du alles richtig gemacht hast. Ausnahmsweise korrigiere ich die Tags mal für dich, weil dies dein erster Beitrag ist, in Zukunft solltest du selber drauf achten. Tags beginnen mit etwas wie [tag] und enden mit [/tag]. Die Buttons unter dem Editfenster funktionieren so:
    a) Text markieren, Button drücken -> markierter Text wird in entsprechende Tags gesetzt
    b) Button drücken -> Anfangstag wird an aktueller Cursorposition eingefügt. Button wird mit einem '*' markiert. Button erneut drücken -> Endtag wird eingefügt.

    In deinem Code sind ein paar sehr schwere Fehler. Bei einigen hast du nicht aufgepasst (verzeihlich als Anfänger), bei anderen sind deine Quellen schuld. Letzteres ist sehr schlecht, denn du lernst Blödsinn, den du hinterher nur schwer wieder los wirst.
    -Das mit dem fflush(stdin) vergiss mal lieber ganz schnell und benutze die Quelle nie wieder.
    -iostream, cstdio, using namespace. Das ist C++, kein C. Schmeiß die Quelle weg, aus der du das hast. C und C++ sind unterschiedliche Sprachen, Mischen geht nicht gut. In C wäre das was du brauchst:

    #include <stdio.h>
    #include <stdlib.h>
    

    Da das Programm bei dir anscheinend übersetzt wurde, hast du anscheinend einen C++-Compiler benutzt. Tu das nicht! Mit solch einfachen Programmen mag das noch funktionieren, weil manche C-Programme auch gültiges C++ sind, später kommst du damit aber in Schwierigkeiten. Viele Compiler können beide Sprachen, du musst ihnen nur sagen, welche von beiden sie beim Übersetzen benutzen sollen.

    Fehler, die du gemacht hast:
    -Der scanf-Formatspezifizierer für short ist "%hd". "%d" ist für Integer.
    -Der printf-Formatspezifizierer für int ist "%d". %ld" ist für long int.

    P.S.: Die Beiträge von NoWeapon in diesem Thread sind ... nicht sehr gut. Ignorier sie lieber.


  • Mod

    Nowaepon schrieb:

    Ichvermute, dass dir die Entertaste da Querhaut (siehe mein editierter Post).
    Sicher bin ich mir aber auch nicht. Bin selbst noch Anfänger. 😃

    Hallo Noweapon. Es ist ja sehr löblich, dass du als Anfänger anderen Anfängern helfen möchtest. Wenn du dir bei einer Antwort aber nicht so sicher bist, dann antworte lieber gar nicht; mach deutlich dass du dir nicht sicher bist; oder teste deine Lösung gründlich.

    Deine Tipps mit der Entertaste sind ziemlicher Quark, um das mal direkt zu sagen. Ebenso ist das verlinkte Tutorial eines der gefürchteten Tutorials, die von Anfängern ohne Ahnung geschrieben wurden, nachdem sie ihr erstes C-Buch gelesen haben.



  • Danke SeppJ,

    wie ich sehe sollte ich meine Quellen wirklich nocheinmal überdenken und der Fehler mit dem Code wird nicht wieder vorkommen.



  • Alles klar. In Zukunft passe ich mehr auf.

    Beim Tutorial dachte ich, dass es gut ist. Mein Informatiklehrer welcher uns auch im Unterricht C beibringt hat es uns aks Vorlage gegeben.

    Hättet ihr dann vielleicht ein gutes Tutorial für uns?
    Das würde uns beiden wohl ganz gut tun.

    Und MagnumOpus, entschuldige bitte meinen Quark. 😃


  • Mod

    Ich fürchte, mir ist kein gutes, deutschsprachiges Tutorial für C bekannt. Das liegt an folgendem: Wer schreibt Tutorials? Leute, die denken, sie hätten Ahnung. In der Regel Anfänger, nach Lektüre ihres ersten Buches. Denn ein Tutorial schreiben und veröffentlichen kann jeder.
    Was machen die Leute, die wirklich Ahnung (und didaktisches Vermögen!) haben? Wenn sie sich derart viel Arbeit machen, ihr Wissen weiter zu geben. Dann schreiben sie ein Buch. Denn wenn sie wirklich gut sind, dann wird das auch verlegt. Meistens schreiben sie dann auch auf Englisch, weil sie somit mehr Leser erreichen und/oder selber Muttersprachler sind.

    Die Empfehlung ist daher wohl, sich die Übersetzung eines englischsprachigen Fachbuches zu besorgen. Z.B. den K&R. Oder besser gleich das Original. Solche Standardwerke sollte es auch in vielen Bibliotheken geben.



  • Danke für deine Antwort.
    Generell habe zumindest ich keine allzu großen Schwierigkeiten mit Englisch. Ich werde mich dann mal ein wenig umschauen und gegebenenfalls nochmal hier im Forum nachfragen. Ich möchte mich ja nicht wieder verkaufen.



  • So ich habs endlich fertig. Es hat länger gedauert als ich gedacht habe ( hatte noch weiter Schwierigkeiten wie statt nem Komma benutzt man ja nen Punkt bei Fließkommazahlen 😡 ) aber ich bin stolz nach 3 Stunden fertig zu sein. Hier ist es.

    #include <stdio.h> 
    #include <stdlib.h>
    
    int main(int argc, char *argv[])
    {
        int Geburtstag, Geburtsmonat, Geburtsjahr;
        int Heutigertag, Heutigermonat,Heutigesjahr;
        int Jahregelebt, Monategelebt;
        double Wochengelebt, Tagegelebt, Stundengelebt, Minutengelebt, Sekundengelebt;
    
        printf("Hallo, diese Programm wird deine verlebt Lebenszeit ermitteln.\n\n");
        getchar();
    
        printf("Bitte geben sie ihr Geburtsdatum an [TT.MM.JJJJ]:");
        scanf("%d.%d.%d", &Geburtstag, &Geburtsmonat , &Geburtsjahr);
    
        printf("\n\nGeben sie bitte das heutige Datum ein [TT:MM:JJJJ]:");
        scanf("%d.%d.%d",&Heutigertag ,&Heutigermonat ,&Heutigesjahr);
    
        Jahregelebt = Heutigesjahr - Geburtsjahr;
        Monategelebt = (Jahregelebt * 12) + (Heutigermonat - Geburtsmonat);
        Wochengelebt = Monategelebt * 4.34812141;
        Tagegelebt = Wochengelebt * 7;
        Stundengelebt = Tagegelebt * 24;
        Minutengelebt = Stundengelebt * 60;
        Sekundengelebt = Minutengelebt * 60;
    
        printf("Jahre:%d\n\n",Jahregelebt);
        printf("Monate:%d\n\n",Monategelebt);
        printf("Wochen:%04lf\n\n",Wochengelebt);
        printf("Tage:%04f\n\n",Tagegelebt);
        printf("Stunden:%04f\n\n",Stundengelebt);
        printf("Minuten:%04f\n\n",Minutengelebt);
        printf("Sekunden:%04f\n\n",Sekundengelebt);
        getchar();
    
        system("PAUSE");
        return EXIT_SUCCESS;
    }
    


  • Du kannst auch das heutige Datum vom Programm ermitteln lassen:
    Mit time erhälst du die aktuelle Zeit, mit localtime konvertierst du sie zu tm. Damit kannst du dann die benötigten Informationen ermitteln.



  • Sehr geil. Ich hatte schon an sowas gedacht aber hab mir dann überlegt das dass mit den Mitteln die ich bis jetzt kenne wohl er nicht möglich ist.
    Muss ich unbedingt noch einbaun.



  • @SeppJ: mich würde interessieren, warum du das Tutorial http://www.c-howto.de für schlecht hältst, denn ich habe es mir mal angeschaut und finde es recht ansprechend gemacht und sehe auch inhaltlich keine Fehler.
    Und schließlich gibt es dieses Tutorial ja auch als Buch - d.h. warum sollte ein anderes Buch dann besser sein?

    Mir ist klar, daß man mit einem Tutorial nicht den gesamten Sprachschatz (+ alle Standard-Lib-Funktionen) abdeckt, und man daher dann bei K&R o.ä. weiterlesen sollte. Um aber den Einstieg in C (+ Entwicklungsumgebung) zu finden, sollte es ausreichen.


  • Mod

    Die direkt verlinkte Seite hat völligen Quatsch zum Thema "Entertasten" und "Tastaturpuffern" beschrieben. Siehe oben. Danach habe ich gar nicht weiter gelesen.

    P.S.: Ich habe mal ein bisschen durch das Tutorial geblättert. Einige weitere Fehler gefunden. So etwas darf nicht sein.
    Außerdem ist es viel zu knapp, um damit C zu lernen. Nenn mir eine Person, die nach dem Lesen das Kapitels über Arrays damit in C umgehen kann. Wichtige Sonderfälle wie der Array to Pointer Decay werden nicht einmal erwähnt!



  • Th69 schrieb:

    Mir ist klar, daß man mit einem Tutorial nicht den gesamten Sprachschatz ...

    So umfangreich ist C nun auch wieder nicht.

    Th69 schrieb:

    ...(+ alle Standard-Lib-Funktionen) abdeckt, ...

    Da es auch nicht so viele sind, kann man sie aber kurz erwähnen.

    Es wird überhaupt nicht auf mögliche Probleme und Fallen eingegangen.
    Weder allgemeine Probleme noch spezielle bei C.

    Gleich die ersten Beispiele sind Müll:
    - Telefonnummern als int-Variablen
    - Finanzberechnung mit float


Anmelden zum Antworten