Benutzung von sprintf()



  • Hi,

    mein Programm soll alle Daten (hier: Plural von Datum) vom 01.01.1980 bis 30.12.2010 in Char-Array umwandeln und als String ausgeben.

    Der Einfachheit halber haben hier alle Monate genau 30 Tage.

    char year_str[4], month_str[2], day_str[2];
    int year,month,day;
    
    for (year=1980; year<=2010; year++) {
      sprintf(year_str, "%i", year);
    
      for (month=1; month<=12; month++) {
        if (month < 10)
          sprintf(month_str, "0%i", month);
        else
          sprintf(month_str, "%i", month);	  
    
        for (day=1; day<=30; day++) {
    	if (day < 10)
    	  sprintf(day_str, "0%i", day);
    	else
    	  sprintf(day_str, "%i", day);
    
    	printf("%s.%s.%s\n", day_str, month_str, year_str);
        }
      }
    }
    

    Der Tag (Variable day_str) wird korrekt ausgegeben. Für Jahr und Monat wird leider nichts ausgegeben. Kann mir jemand sagen, warum das so ist?

    Danke!


  • Mod

    Deine char-Arrays sind zu kurz. Wenn du mit C-Strings arbeiten möchtest, musst du immer ein zusätzliches Zeichen vorsehen, weil per Konvention ein Nullzeichen das Ende eines C-Strings markiert.

    Aufgrund deines Codes bin ich mir nicht sicher, ob du nicht C machen willst, obwohl du hier im C++ Unterforum gefragt hast. Falls du C++ machen willst, gibt es da wesentlich bessere Methoden um Zahlen und Strings ineinander umzuwandeln. Falls du doch C machen möchtest, bist du hier schon auf den richtigen Weg.

    Falls das ganze einen konkreten Anwendungszweck haben soll und nicht rein zu deiner eigenen Übung dienen soll: Zur Umrechnung von Datums- und Zeitformaten gibt es schon eine Menge Funktionalität in der Standardbibliothek (Header time.h in C bzw. ctime in C++).



  • Vielen Dank! Es funktioniert jetzt.

    Es ist eigentlich egal ob ich das in C oder C++ mache. Es muss einfach nur funktionieren. Ich dachte mir, dass ich schneller bin, wenn ich es in C einfach selber schreibe, da ich von der STL und den zur Verfügung stehenden Funktionen noch keine Ahnung habe. Wenn es aber damit einfacher ist, die Schaltjahre (#Tage im Februar) zu berücksichtigen, dann wäre es wahrscheinlich sinnvoll mir das mal genauer anzuschauen.


  • Mod

    matthias123 schrieb:

    Vielen Dank! Es funktioniert jetzt.

    Es ist eigentlich egal ob ich das in C oder C++ mache. Es muss einfach nur funktionieren. Ich dachte mir, dass ich schneller bin, wenn ich es in C einfach selber schreibe, da ich von der STL und den zur Verfügung stehenden Funktionen noch keine Ahnung habe. Wenn es aber damit einfacher ist, die Schaltjahre (#Tage im Februar) zu berücksichtigen, dann wäre es wahrscheinlich sinnvoll mir das mal genauer anzuschauen.

    Eine kurze Demo, was so alles möglich ist:

    #include <stdio.h>
    #include <time.h>
    #include <locale.h>
    
    int main ()
    {
      const time_t start=315532801;     /* 1.1.1980 00:01 */
      const time_t end=1293753601;      /* 31.12.2010 00:01 */
      time_t counter;
      struct tm * timeinfo;
      char buffer [100];
    
      setlocale(LC_TIME,"de_DE.utf8");  /* Passendes einsetzen */
    
      for (counter = start; counter<=end; counter += 60*60*24)
        {
          timeinfo = localtime ( &counter );
          strftime (buffer,100,"Es ist %A, der %d. %B %Y. Dies ist die %W. Kalenderwoche.",timeinfo);
          puts (buffer);
        }
    
      return 0;
    }
    

    Ich war dabei so frei dein Programm am 31.12 anstatt am 30.12 enden zu lassen.



  • Danke!! Das geht ja wirklich elegant 🙂

    Ich frage mich hier gerade nur, wie du auf den Wert von start gekommen bist.

    const time_t start=315532801;     /* 1.1.1980 00:01 */
    

  • Mod

    matthias123 schrieb:

    Danke!! Das geht ja wirklich elegant 🙂

    Ich frage mich hier gerade nur, wie du auf den Wert von start gekommen bist.

    const time_t start=315532801;     /* 1.1.1980 00:01 */
    

    Ehrlich gesagt, habe ich es nachgeschlagen 😉 . Leider ist nicht standardisiert, dass dies wirklich besagtes Datum ist, aber nur auf äußert exotischen Maschinen ist das nicht der Fall:
    http://www.onlineconversion.com/unix_time.htm

    Falls jemand eine bessere Methode kennt, bin ich auch brennend daran interessiert. In der time.h sind nur Methoden um das aktuelle Datum rauszufinden.



  • Was ist mit mktime?


  • Mod

    seldon schrieb:

    Was ist mit mktime?

    Ich bin so blind! Ja, genau das ist die Lösung.

    Ich hatte die Funktionen nur den Parametern nach angeguckt und hatte etwas gesucht, das char* in time_t umwandelt. Da habe ich diese Funktion glatt übersehen.


Anmelden zum Antworten