Ich habe mit der std::string_view
Bibliothek herumgespielt und darüber nachgedacht, eine Codebasis zu ändern, an der ich gearbeitet habe, um std::string_view
so viel wie möglich zu verwenden. In vielen Threads, die ich zum Thema gelesen habe, wann und wo ich es verwenden soll, std::string_view
anstatt const std::string &
. Ich habe viele Antworten gesehen, die sagten: "Wenn Sie keine nullterminierte Zeichenfolge benötigen." Als ich anfing, im Internet nach "Wann brauchen Sie eine nullterminierte Zeichenfolge?" Zu suchen. Ich habe keine wirklich hilfreichen Antworten zu diesem Thema gefunden.
Ich kann mir ein Beispiel für eine externe Bibliothek vorstellen, auf die Sie verlinken werden std::string
. In diesem Fall benötigen Sie eine nullterminierte Zeichenfolge, da diese Bibliothek dies erfordert. Ich denke, ein anderes Beispiel wäre, wenn Sie den String selbst ändern müssten, aber dann würden wir ihn nicht weitergeben, const &
wenn wir ihn ändern müssten .
Wann müssten Sie also eine nullterminierte Zeichenfolge verwenden?
Links, die ich mir angesehen habe:
quelle
const char*
Argument an. eerorikas anwer hat ein beispiel.Antworten:
Sie benötigen eine nullterminierte Zeichenfolge, wenn die von Ihnen verwendete API angibt, dass Sie sie benötigen. Diese Anforderung ist in C-Schnittstellen allgegenwärtig und wird in einigen Dokumentationen nicht explizit angegeben. Wenn ein Funktionsargument ein
char*
(möglicherweise zu const) ist und es kein Längenargument gibt, sollten Sie die Anforderung annehmen, sofern in der Dokumentation nichts anderes angegeben ist.Nehmen wir
execve
als Beispiel die Funktion (aus dem POSIX-Standard):Wenn Sie ein nicht nullterminiertes Argument als übergeben
pathname
, ist das Verhalten Ihres Programms undefiniert.quelle
std::string
, wie ausgeführt werdenexecve(pathname.c_str(),...,...)
?Es ist eigentlich ziemlich einfach zu wissen. Wenn Sie eine Funktion aufrufen, die nur eine c-Zeichenfolge (
char*
/const char*
) verwendet, benötigen Sie eine nullterminierte Zeichenfolge, da nur so ermittelt werden kann, wo sich das Ende der Zeichenfolge befindet.Wenn Sie stattdessen eine Funktion haben, die ein
char*
/const char*
plus die Größe annimmt , oder nur zwei Zeiger, die den Anfang und das Ende der Daten markieren, benötigen Sie keine nullterminierte Zeichenfolge, da Sie die Zeichenfolgengröße haben / erhalten können, ohne zu a zu iterieren Nullterminator.quelle