Wann benötigen Sie in einem schreibgeschützten Szenario eine nullterminierte Zeichenfolge?

10

Ich habe mit der std::string_viewBibliothek herumgespielt und darüber nachgedacht, eine Codebasis zu ändern, an der ich gearbeitet habe, um std::string_viewso viel wie möglich zu verwenden. In vielen Threads, die ich zum Thema gelesen habe, wann und wo ich es verwenden soll, std::string_viewanstatt 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:

  1. Wie genau ist std :: string_view schneller als const std :: string &?
  2. Wann würde ich const & std :: string anstelle von std :: string_view übergeben?
  3. Warum nur String-Ansicht?
  4. Ist es sinnvoll, const std :: string & Argumente in C ++ 17 zu verwenden?
Sailanarmo
quelle
5
Meistens für die Schnittstelle mit C-APIs.
Walnuss
@uneven_mark können Sie ein Beispiel dafür geben?
Sailanarmo
Die akzeptierte Antwort auf die vierte Frage, die Sie verlinken, scheint diese Frage zu beantworten.
François Andrieux
1
@Sailanarmo Die meisten Funktionen von z. B. POSIX oder einer anderen C-Bibliothek nehmen ein const char*Argument an. eerorikas anwer hat ein beispiel.
Walnuss
1
@ FrançoisAndrieux lautet also wirklich die Antwort: "Solange die API keine nullterminierte Zeichenfolge anfordert?"
Sailanarmo

Antworten:

10

Wann benötigen Sie eine nullterminierte Zeichenfolge?

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 execveals Beispiel die Funktion (aus dem POSIX-Standard):

int execve(const char *pathname, char *const argv[], char *const envp[]);

Wenn Sie ein nicht nullterminiertes Argument als übergeben pathname, ist das Verhalten Ihres Programms undefiniert.

Eerorika
quelle
In diesem Fall würde der Pfadname, sollte es ein sein std::string, wie ausgeführt werden execve(pathname.c_str(),...,...)?
Sailanarmo
6

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.

NathanOliver
quelle