printf und benutzerdefinierte Klasse

Ich habe eine eigene Klasse, die eine benutzerdefinierte Zeichenfolgenklasse darstellt. Ich benutze VS2012RC. Ich habe einige Operatoren meiner Klasse CustomString überladen.

Hier ist ein Code:

CustomString::CustomString(string setstr)
{           
    str = setstr;
}

CustomString::operator const char *()
{   
    return (this->str.c_str());
}

CustomString &CustomString::operator = (char *setstr)
{
    str = setstr;
    return *this;
}

Ich kann mein Objekt so definieren und verwenden:

CustomString str = "Test string";

und ich kann das Ergebnis ausdrucken als:

printf(str);

printf((string)(str).c_str());

printf((string)(str).data());

printf("%s\n",(string)(str).c_str());

printf("%s\n",(string)(str).data());

Und es liegt kein Fehler vor.

Aber wenn ich es so benutze:

printf("%s\n", str);

Es gibt eine Ausnahme in msvcr110d.dll (Fehler beim Speicherzugriff)

Warumprintf (str) ist ok aberprintf ("% s \ n", str) ist nicht ok

Wie kann ich meinen Code ändern, um zu verwendenprintf ("% s \ n", str) ?

...

Nach stundenlangem googeln habe ich festgestellt, dass explict cast (string), static_cast (str) und _str () eine nullterminierte Zeichenfolge hinzufügen: '\ 0';

Ich habe meinen Code geändert als:

printf("%s\n",str + '\0');

und es hat funktioniert!

Gibt es eine Möglichkeit, meinen benutzerdefinierten Konstruktor zu ändern, um eine nullterminierte Zeichenfolge hinzuzufügen und einen korrekten Wert mit nullterminierten Zeichen zu übergeben, um den folgenden Code auszuführen:

printf("%s\n",str);

Antworten auf die Frage(4)

Ihre Antwort auf die Frage