Eine weitere übliche Lösung ist der Anrufer bereitzustellen
char * CombineStr(const char * str1,
const char * str2,
char * strOut,
size_t outlen)
{
size_t len = snprintf(strOut, outlen, "%s%s", str1, str2);
if (len < outlen)
{
return strOut;
}
return NULL;
}
Hinweis den Schalter von sprintf
zu snprintf
verhindern Pufferüberlauf des Ausgangspuffer der verkettete Zeichenkette, die die Länge des Puffers überschreiten zu lassen. Dadurch können wir den Überlauf abfangen und ein ungültiges Ergebnis zurückgeben, damit der Anrufer weiß, dass buffer
nicht vertrauenswürdig ist.
Typische Anwendungen würde
char buffer[256];
if (CombineStr("I's the b'y that builds the boat",
"And I's the b'y that sails her",
buffer,
sizeof(buffer)) != NULL)
{
// use buffer
}
sein Es sei darauf hingewiesen werden muss, dass snprintf
wackelig Unterstützung und kann nicht immer trauen null beendet worden, aber Sie können sicher sein, dass es nicht der Pufferüberlauf hat.
UB? Sie ordnen strout im Stapel zu und geben einen Zeiger auf eine Position zurück, die bei Rückgabe der Funktion "freigegeben" wird. – Amadeus
@Amadeus Einheimische sind im Stapel nicht im Heap zugeordnet. – Sergio
@Serhio danke richtig gedacht, falsch schreiben – Amadeus