Time, Speicherverwaltung in C++
-
Hallo Leute,
also ich habe folgendes Problem:
ich hole mir die Systemzeit, will mir daraus meinen Namen generieren.
So die printf-anzeife passt, sieht gut aus. Sobald ich aber die strings zusammensetze kommt nur blödsinn raus
. Warum?
Hier der einfache Code:
[cpp]#include <iostream> #include <time.h> #include <windows.h> #include <winsock.h> #include <winsock2.h> int main() { char* Name=new char[256]; char year[4]; char month[4]; char Stunde[4]; char minute[4]; char date[2]; int i; // char Name[20]; SYSTEMTIME systime; GetLocalTime(&systime); itoa(systime.wMinute,minute,10); itoa(systime.wHour,Stunde,10); itoa(systime.wMonth,month,10); itoa(systime.wYear,year,10); printf("%s %s %s %s\n", Stunde, minute, year, month); for(i=0;i<2;i++) date[i]=year[i+2]; Name=date; //strcat(Name,"."); //strcat(Name,minute); //strcat(Name,minute); printf("%s\n", Name); return 1; }Danke für eure Hilfe
Tentone
-
#include <iostream> #include <time.h> #include <windows.h> #include <winsock.h> #include <winsock2.h> int main() { char* Name=new char[256]; // warum nicht std::string? char year[4]; char month[4]; char Stunde[4]; char minute[4]; char date[2]; int i; // char Name[20]; SYSTEMTIME systime; GetLocalTime(&systime); itoa(systime.wMinute,minute,10); itoa(systime.wHour,Stunde,10); itoa(systime.wMonth,month,10); itoa(systime.wYear,year,10); printf("%s %s %s %s\n", Stunde, minute, year, month); for(i=0;i<2;i++) date[i]=year[i+2]; Name=date; // jetzt zeigt Name auf date, also ein char[2]. //strcat(Name,"."); // kann gar nicht mehr funzen, siehe unten //strcat(Name,minute); //strcat(Name,minute); printf("%s\n", Name); return 1; }Bei deinem ersten strcat zeigt Name schon nicht mehr auf die reservierten 256 byte, sondern auf die 2 byte von date. Und diese sind nicht einmal 0-terminiert, weswegen das Anhängen von weiteren Zeichen mit strcat eh nicht funktioniert. Nimm lieber std::string, lies dich da ein.
-
Falls du nicht wie es Fellhuhn vorgeschlagen hat std::string verwenden willst, kannst du auch noch sprintf verwenden...
sprintf(Name, "%s.%s", date, year); // Verwendung wie printfZur Umwandlung von Zahlen nach Strings und zurück gibts übrigens auch noch nen guten FAQ Beitrag
Gruß
Tobi
-
Hallo nochmal,
habe den Code jetzt mit ostringstream umgeschrieben.
Bekomme aber jetzt folgende Fehlermeldung:
aggregate 'std::ostringstream year' has incomplete type and connot be definedGruß
Tentone
-
Der sprintf-Ansatz funktioniert ohne Limitierung aber auch nicht, da date nicht 0-terminiert ist und sprintf so nicht weiß, wann date endet. Und vorher wird sowieso über die Speicherbereiche geschrieben bei itoa. Immer die terminierende 0 mit einberechnen bei der Länge.
-
Fellhuhn schrieb:
Der sprintf-Ansatz funktioniert ohne Limitierung aber auch nicht, da date nicht 0-terminiert ist und sprintf so nicht weiß, wann date endet. Und vorher wird sowieso über die Speicherbereiche geschrieben bei itoa. Immer die terminierende 0 mit einberechnen bei der Länge.
Da hast du natürlich völlig recht...
-
Hallo,
Tentone schrieb:
Hallo nochmal,
habe den Code jetzt mit ostringstream umgeschrieben.
Bekomme aber jetzt folgende Fehlermeldung:
aggregate 'std::ostringstream year' has incomplete type and connot be definedGruß
Tentone<sstream> includieren, nicht <strstream>
MfG,
Probe-Nutzer
-
mal ganz ehrlich: der erste Quellcode den du gepostet hast, hat rein garnichts mit C++ zu tun, mal abgesehen vom allerersten include - und das ist überflüssig weil du keine iostreams benutzt. Binde stattdessen stdio.h ein und es ist einfach nur ein C-Programm.
Also bist du entweder im falschen Forum gelandet oder du solltest dich dringend mal mit den C++ iostreams, stringstreams, strings usw. auseinandersetzen, je nachdem ob du denn nu auf C oder C++ aus bist.