strptime macht Probleme bei Leerzeichen



  • Servus,

    habe zu Übungszwecken ein Programm geschrieben, welches einem die Differenz zu einem Datum ausgibt, in Tagen/Stunden/Minuten/Sekunden

    #include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    
    void calc(char *input)
    {
        struct tm tm;
        time_t t;
        time_t now;
    
        if(strptime(input, "%d.%m.%Y_%H:%M", &tm) != NULL)
        {
            tm.tm_isdst = -1;
            tm.tm_sec = 0;
            t = mktime(&tm);
            now = time(NULL);
    
            int tag = 60*60*24;
            int stunde = 60*60;
            int minute = 60;
    
            if(now>t)
            {
                t = now-t;
                printf("\nEs sind %d Tage, %d Stunden, %d Minuten und %d Sekunden vergangen.\n",t/tag,(t%tag)/stunde,((t%tag)%stunde)/minute,((t%tag)%stunde)%minute);
            }
            else
            {
                t = t-now;
                printf("\nNur noch %d Tage, %d Stunden, %d Minuten und %d Sekunden!\n",t/tag,(t%tag)/stunde,((t%tag)%stunde)/minute,((t%tag)%stunde)%minute);
            }
        }
        else
        {
            printf("\nFehler in der Eingabe!\n");
        }
    }
    
    int main()
    {
        char time[20];
        printf("Bitte Datum und Uhrzeit eingeben (Format: TT.MM.YYYY_hh:mm)\n");
        scanf("%s",time);
        calc(time);
    }
    

    Mein Problem ist der unschöne Unterstrich zwischen dem Datum und der Uhrzeit.
    Sobald ich diesen durch einen Leerzeichen ersetze, funktioniert das Programm nicht mehr richtig.

    Weiterhin frage ich mich, wie ich das Programm kürzer/schöner schreiben könnte, denn ich fange gerade erst mit C an und suche immer nach Optimierungen. Besonders die printf's der Ergebnisse gefallen mir nicht.

    Vielen Dank für eure Bemühungen 🙂


  • Mod

    Wir gucken nochmal in die Beschreibung von scanf:
    http://www.cplusplus.com/reference/cstdio/scanf/

    s: String of characters
    Any number of non-whitespace characters, stopping at the first whitespace character found. A terminating null character is automatically added at the end of the stored sequence.

    P.S.: Weiterhin würde ich difftime benutzen, denn dazu ist es da. Deine Formatspezifizierer sind nicht portabel, time_t muss nicht int sein (und wäre auch eher ungewöhnlich). Entweder caste das Ergebnis deiner Rechnung auf den ausgegebenen Typ oder besser: Berechne das Ergebnis einfach vorher!

    Es ist auch sehr gefährlich, eine Zeichenkette unbekannter Länge zu lesen, ohne sich vor Überläufen zu schützen. Das solltest du bei der nötigen Überarbeitung der Eingabefunktion ebenfalls beachten.


Anmelden zum Antworten