verketten const char * strings
Ich bin verwirrt über char *
und const char *
. In meinem Beispiel bin ich mir nicht sicher, wie Sie Sie zusammen. Ich habe mehrere const char *
strings möchte ich zu verketten, um eine endgültige const char *
string.
struct MyException : public std::exception
{
const char *source;
int number;
const char *cause;
MyException(const char *s, int n)
: source(s), number(n) {}
MyException(const char *s, const char *c)
: source(s), number(0), cause(c) {}
const char *what() const throw()
{
if (number != 0) {
char buffer[1024];
//why does this not work?
cause = strerror_r(number, buffer, 1024);
}
//how to concatenate the strings?
return source + ": " + cause;
}
};
- Warum die Arbeit mit cstrings? Sind Sie beschränkt, für Sie? Ich würde Ihnen empfehlen, std::string.
- Ist das eine übung? Wenn nicht könnte man machen das Leben einfacher mit std::strings ??
- Dito, dito. Benutzen Sie std::string. viel bessere Lösung für die meisten Probleme mit cstrings.
- es soll nicht auf ... beim werfen, nicht diring Konstruktion. alle die <stdexcept> Klassen, abgeleitet von std::exception zu verwenden std::string!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie speichern eine
std::string
und immer noch zurückgebenconst char *
von Ihr was Funktion.Verwenden Sie einfach
strcat()
undstrcpy()
Funktion von string.h.http://www.cplusplus.com/reference/clibrary/cstring/strcat/
http://www.cplusplus.com/reference/clibrary/cstring/strcpy/
Auch, da Sie nicht haben, um änderung des ursprünglichen strings, der Unterschied zwischen
const char*
undchar*
egal.Vergessen Sie auch nicht
malloc()
(reservieren Sie den Platz für) die erforderliche Größe der Ziel-string.what()
? Oder kann es nur mit literalen und globalen Variablen? Dies schafft eine Schnittstelle, die ist einfach schrecklich. Mit einem std::string löst die meisten dieser.char*
oder einechar*
und einint
) und die Ausgabe (der Rückgabewert von dem, was()) ist einconst char*
passt es sich den Anforderungen. Wenn einstd::string
dient als Vermittler, das sollte in Ordnung sein, und bevorzugt, wenn er den code s Schnittstelle 14 mal besser.Dies ist, wie ich dies umsetzen:
Dinge zu beachten:
Den original-code wurde mit einem lokale variable für einen Puffer. Das ist eine schlechte Idee, da der Zeiger gespeichert, in
cause
wäre ungültig ist der moment, der Geltungsbereich endet.Für die verkettete Nachricht, die dynamische Zuordnung erforderlich wäre. Und das bedeutet auch, dass die Bereinigung der Lagerung erforderlich wäre. Ich schnappte mir ein vorhandenes Werkzeug, das funktioniert und liefert string-ähnliche Operationen:
std::string
.Mit
std::string
Verkettung kann getan werden, mit der+
Betreiber. Beachten Sie, wie ich es gefragt reservieren Speicher für die Größe erwartet. Dies ist Speicher, der eine Optimierung und ist nicht erforderlich: der string würde genügend Speicher oder so.what
nicht werfen eine Ausnahme, ansonsten wird ein Anrufstd::unexpected
entstehen würden. Also der string nicht zugeordnet werden kann, hier.Wenn Sie arbeiten müssen, mit
char*
Zeiger, die Sie verwenden möchtenstrcat
.strcat
nimmt zwei Argumente, diechar*
und einconst char*
ab und fügt die Zeichenfolge gezeigt, durch denconst char*
auf diechar*
. Dies bedeutet, dass müssen Sie zuerst kopieren Sie Ihre ersten string über.Werden Sie wollen, um etwas wie das hier tun:
Ist das nicht nur hässlich? Und denken Sie daran,, weil Sie haben dynamisch zugeteilt char* zurückgegeben, die Funktion der Aufrufer muss sich daran erinnern
delete[]
es. Diese Hässlichkeit und der Notwendigkeit der Sicherstellung der Aufrufer bereinigt, die in der richtigen Weise ist, warum Sie sind besser mit einem string-Implementierung wiestd::string
.what
weilnew
werfen kann.Reservieren eines Puffers der Größe
strlen(source) + strlen(cause) + 3
und verwendensprintf
zu erstellen Sie Ihre Nachricht. Eigentlich kann man sich bewegen, diesen code an den Konstruktor so, dasswhat
wird einfach getter.Wenn Sie wirklich müssen, verwenden Sie c-strings haben, sollten Sie sich
strcat()
verketten Sie zusammen. Aber, da Sie erstellen eine benutzerdefinierte Ausnahme, es wäre sinnvoll, zu prüfen, mitstd::string
statt, denn es ist mehr freundlich zu verwenden in C++.