sprintf & eigene Stringklasse



  • Hallo,

    ich habe eine einge Stringklasse ER_String.

    Folgendes funktioniert:

    ER_String str = "hallo";
    char  buffer[200];
    
    sprintf(buffer, "%s",  (char*) str );  
    printf(buffer);
    

    Im obigen Beispiel habe ich extra auf char* casten müssen.
    Ich möchte aber gerne soetwas haben, OHNE Cast.

    sprintf(buffer, "%s",  str );
    

    Anscheinend wird intern ein void* - cast gemacht. Kann ich das irgendwie unterbinden/blockieren?

    Ich bleibe an der Sache dran. Vielleicht kann ich's nächstes Mal besser erklären.



  • Einfach den << Operator für ostreams überladen. printf verwendet keiner in c++



  • printf verwendet keiner in c++

    Mir ist nichts besseres eingefallen 🙄 Meine C/C++ Kenntnisse sind schon etwas eingerostet.

    Einfach den << Operator für ostreams überladen

    OK. Werd's mir anschauen.

    Merci



  • #include <iostream>
    #include <string>
    
    using namespace std;
    
    class bar {
    	string text;
    	size_t zahl;
    public:
    	bar(string t, size_t z): text(t), zahl(z);
    	// so kann die Funktion auf die privaten Members zugreifen!
    	friend std::ostream& operator <<(ostream& out, const bar& obj);
    };
    
    std::ostream& operator <<(ostream& out, const bar& obj) {
    	out << obj.text << " " << obj.zahl << endl;
    	return out;
    }
    
    int main() {
    	bar foo("hallo", 12);
    	cout << foo;
    
    	return 0;
    }
    


  • Ich habe den << Operator überladen, aber leider funktionierts immer noch nicht.
    Muss immer noch auf (char*) casten 😞



  • Hi,

    wenn du den op<< für deine klasse überladen hast dann musst du die auch verwenden. Das hilft dir beim sprintf nicht weiter. Wenn du also das verhalten von sprintf haben willst verwende stringstreams. Dafür funktioniert dann dein op<<.



  • Auf die Schnelle werde ich aus deiner Antwort nicht schlau. Hast du ein Beispiel?

    Danke



  • Hi,

    ich hab deinem beitrag jetzt einfach mal entnommen dass du den op<< für deine klasse wie beschrieben überladen hast.

    Und dann erwartet hast, dass du beim sprintf nicht mehr casten musst. Wenn ich das falsch sehe, dann berichtige mich. Was die anderen aber gemeint haben, ist dass du dadurch dass du mit sprintf arbeitest immer noch casten musst weil das überladen des op<< darauf keinen einfluss hat. Der op<< wurde ja für streams überladen also musst du die entsprechende streams auch verwenden damit das nicht umsonst war.

    Und statt sprintf kann man in c++ eben stringstream verwenden.

    #include <sstream>
    
    ER_String str = "hallo";
    const int value=20;
    std::ostringstream out; //string stream
    
    out<<value<<" "<<str; //jetzt steht im stringstream "20 hallo"
    
    std::cout<<out.str()<<"\n";
    

    Ausgabe ist:

    20 hallo

    Man benuzt also nicht mehr sprintf um in strings zu schreiben sondern die entsprechenden streams und hat etwa das selbe verhalten.

    So far ..

    //EDIT fehler im code



  • Super Danke! Hast mir sehr geholfen. So wie du's beschrieben hast funktionierts.

    Mir werde mir das Ganze mal durch den Kopf gehen lassen.


Anmelden zum Antworten