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!
-
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.
-
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 */
-
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.htmFalls 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?
-
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.