String = String + (char)Int geht nicht



  • nein, ging wohl eher darum die Zahl als Zahl in einen string zu konvertieren.
    Also

    65 = "65"

    und nicht

    65 = "A".



  • na dann mit itoa



  • Hi!

    Mit append hats nicht geklappt.
    Hab es jetzt mit sprintf gelöst:

    sprintf(ctemp, "%d", start);
    temp = DateiName + ctemp;
    

    THX
    Evil-Hunter



  • daishi schrieb:

    na dann mit itoa

    und wegen sowas verweist man auf die FAQ damit die falschen Antworten nicht nochmal alle durchgekaut werden müssen 😉

    itoa gibts im C++ Standard nicht.



  • Dei jetzige Lösung ist aber auch nicht cpp. 🙄



  • dafür aber c++ 😉



  • sprintf ist doch nicht c++



  • Doch.



  • aber die zeile darunter geht in C nicht.

    und nocheinmal sei auf unsere FAQs hingewiesen.
    Für Suchfaule.
    Die Lösung mit sprintf ist übrigens auch dabei 😉



  • davie schrieb:

    und nocheinmal sei auf unsere FAQs hingewiesen.
    Für Suchfaule.

    Da schau ich wohl besser das nächste mal erstma rein! 👍
    Die ist aber auch viel zu weit unten in der Foren-Überischt! 🙄

    THX
    Evil-Hunter



  • #include <iostream>
    
    class String
    {
    	wchar_t *data;
    
    	void CopyStringData(const String &source)
    	{
    		data = new wchar_t[wcslen(source.data) + 1];
    		wcscpy(data, source.data);
    	}
    
    public:
    	// Konstruktoren:
    	String()
    	{
    		data = new wchar_t[1];
    		data[0] = '\0';
    	}
    	String(const String &source)
    	{
    		CopyStringData(source);
    	}
    	String(const wchar_t *text)
    	{
    		data = new wchar_t[wcslen(text) + 1];
    
    		wcscpy(data, text);
    	}
    	String(const char *text)
    	{
    		int size = (int)strlen(text) + 1;
    
    		// temp erstellen:
    		wchar_t *temp = new wchar_t[size];
    		mbstowcs(temp, text, size);
    
    		// In data schreiben:
    		data = new wchar_t[wcslen(temp) + 1];
    		wcscpy(data, temp);
    
    		// temp löschen:
    		delete[] temp;
    	}
    	String(const int number)
    	{
            data = new wchar_t[33];		// 33 Byte ist das Maximum für _itow
    
    		_itow(number, data, 10);
    	}
    
    	// Destruktor:
    	~String()
    	{
    		delete[] data;
    		data = NULL;
    	}
    
    	// GetWChar: Gibt einen Zeiger auf den String zurück.
    	inline wchar_t* GetWChar()
    	{
    		return data;
    	}
    
    	// Length: Gibt die Länge des Strings zurück.
    	int Length()
    	{
    		return (int)wcslen(data);
    	}
    
    	// Operatoren '+=' zum Anhängen:
    	void operator+= (wchar_t *otherString)
    	{
    		// Erforderliche Gesamtlänge bestimmen:
    		const int length = (int)wcslen(data) + (int)wcslen(otherString) + 1;
    
    		// In einem temporärem String zusammenfügen:
    		wchar_t *temp = new wchar_t[length];
    		wcscpy(temp, data);
    		wcscat(temp, otherString);
    
            // Den String in das L-Value Objekt übertragen:
    		delete[] data;
    		data = new wchar_t[length];
    		wcscpy(data, temp);
    
    		// Temprären String löschen:
    		delete[] temp;
    	}
    	void operator+= (const String &otherString)
    	{
    		(*this) += otherString.data;
    	}
    	void operator+= (const char *otherString)
    	{
    		String temp(otherString);
    		(*this) += temp.data;
    	}
    	void operator+= (int number)
    	{
    		String temp(number);
    		(*this) += temp.data;
    	}
    
    	// Operatoren '=' zum Zuweisen:
    	void operator= (const String &otherString)
    	{
    		CopyStringData(otherString);
    	}
    	void operator= (const wchar_t *text)
    	{
    		String temp(text);
    		CopyStringData(temp);
    	}
    	void operator= (const char *text)
    	{
    		String temp(text);
    		CopyStringData(temp);
    	}
    	void operator= (int number)
    	{
    		String temp(number);
    		CopyStringData(temp);
    	}
    };
    
    // String + <type>:
    inline const String operator+(const String &s1, const wchar_t *s2)
    {
        String tmp(s1);
        tmp += s2;
        return tmp;
    }
    inline const String operator+(const String &s1, const char *s2)
    {
        String tmp(s1);
        tmp += s2;
        return tmp;
    }
    inline const String operator+(const String &s1, int s2)
    {
        String tmp(s1);
        tmp += s2;
        return tmp;
    }
    // String + String:
    inline const String operator+(const String &s1, const String &s2)
    {
        String tmp(s1);
        tmp += s2;
        return tmp;
    }
    

    Für die ganz faulen (was ich bei C++ Strings) verstehen kann, hab ich heute meinen großzügigen Tag 😉

    Evtl. solltest du wchar_t durch char ersetzen, wenn du kein Unicode willst.

    (Keine Garantie für gar nichts, ist noch in der Entwicklung)



  • ich hoffe, du machst diese string klasse jetzt nicht, weil du denkst, standard c++ kann nicht mit wchar_t umgehen.
    außerdem ist im Konstruktor das data = NULL; etwas *sehr* überflüssiges.



  • geht das nicht mit strcpy(string1,string2); ?



  • was geht nicht mit strcpy?
    bei std::strings ist der operator+ überladen, so dass man ganz bequem schreiben kann:

    string DateiName("Blubber");
    string temp = DateiName + ".txt";
    temp += "Was auch immer";
    


  • davie schrieb:

    ich hoffe, du machst diese string klasse jetzt nicht, weil du denkst, standard c++ kann nicht mit wchar_t umgehen.
    außerdem ist im Konstruktor das data = NULL; etwas *sehr* überflüssiges.

    Nein, ich mache die String-Klasse, weil Standard C++ mit Strings nicht vernünftig umgehen kann 😉
    Und ich habe mir angewöhnt, ungültige Pointer immer auf NULL zu setzen. Ich nehme an, du meinst den DEstruktor?

    Und wegen deinem '+' von std::string: du kannst nicht <string> + <int> schreiben. Darum ging es ja ^^



  • Dann bau doch einfach den entsprechenden operator+ dazu, das ist doch viel einfacher, als gleich nen neue string-Klasse zu schreiben.

    MfG Jester



  • Optimizer schrieb:

    Und wegen deinem '+' von std::string: du kannst nicht <string> + <int> schreiben. Darum ging es ja ^^

    Implizite Typumwandlungen sind aber nicht gerade jedermanns Sache.

    Ganz objektiv betrachtet leakt deine Klasse außerdem in operator=. Wieder mal was, was ein Smart-Ptr verhindert hätte - boost::scoped_array beißt doch nicht...



  • Jester schrieb:

    Dann bau doch einfach den entsprechenden operator+ dazu, das ist doch viel einfacher, als gleich nen neue string-Klasse zu schreiben.

    MfG Jester

    Ich will da noch einiges anders machen, wie in der std::string-Klasse. Außerdem lern ich so mal, das new und delete einzusetzen 😕

    operator void schrieb:

    Ganz objektiv betrachtet leakt deine Klasse außerdem in operator=. Wieder mal was, was ein Smart-Ptr verhindert hätte - boost::scoped_array beißt doch nicht...

    Da hast du verdammt recht... 😮
    Danke für den Tipp!



  • also mal ein Bsp. zu strcat

    char *name1="Baum";

    strcat(name1,"haus");

    danach steht in name1 "Baumhaus",
    das ist doch die einfachste Lösung oder etwa nicht?



  • berd schrieb:

    das ist doch die einfachste Lösung oder etwa nicht?

    Nö, es erzeugt undefiniertes Verhalten.


Anmelden zum Antworten