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 printf
    

    Zur 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 defined

    Gruß
    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 defined

    Gruß
    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.


Anmelden zum Antworten