Quando è necessaria una stringa con terminazione null in uno scenario di sola lettura?


10

Ho giocato con la std::string_viewlibreria e ho pensato di cambiare una base di codice su cui ho lavorato per utilizzare std::string_viewil più possibile. Tuttavia, in molti dei thread che ho letto sull'argomento di quando e dove utilizzare std::string_viewanziché const std::string &. Ho visto molte risposte dire: "Quando non hai bisogno di una stringa terminata nulla". Così, quando ho iniziato a cercare sul Web per "quando hai bisogno di una stringa con terminazione null?" Non ho mai trovato risposte utili sull'argomento.

Mi viene in mente un esempio di una libreria esterna a cui collegherai che richiede un std::string. E in quel caso avresti bisogno di una stringa terminata nulla poiché quella libreria lo richiede. Immagino che un altro esempio potrebbe essere se è necessario modificare la stringa stessa, ma non la passeremmo se const &fosse necessario modificarla.

Quindi quando dovresti usare una stringa terminata null?

Link che ho visto:

  1. In che modo esattamente std :: string_view è più veloce di const std :: string &?
  2. Quando dovrei passare const & std :: string invece di std :: string_view?
  3. Perché solo visualizzazione stringa?
  4. Ha senso usare const std :: string e argomenti in C ++ 17?

5
Per interfacciarsi con le API C, principalmente.
noce,

@uneven_mark puoi fornire un esempio di uno?
Sailanarmo,

La risposta accettata alla quarta domanda che colleghi sembra rispondere a questa domanda.
François Andrieux,

1
@Sailanarmo La maggior parte delle funzioni di es. POSIX o qualsiasi altra libreria C che accetta un const char*argomento. la risposta di eerorika ha un esempio.
noce,

1
@ FrançoisAndrieux, quindi la risposta è "Fintanto che l'API non richiede una stringa con terminazione nulla?"
Sailanarmo,

Risposte:


10

Quando hai bisogno di una stringa terminata null?

Hai bisogno di una stringa terminata null ogni volta che l'API che usi ti dice che ne hai bisogno. Questo requisito è onnipresente nelle interfacce C e non esplicitamente indicato in alcuni documenti. Se un argomento di funzione è un char*(possibilmente const) e non esiste un argomento di lunghezza, è necessario assumere il requisito a meno che la documentazione non indichi diversamente.

Prendiamo la funzione execve(dallo standard POSIX) come esempio:

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

Se si passa un argomento terminato non nullo come pathname, il comportamento del programma sarà indefinito.


Quindi, in questo caso, il nome del percorso, se fosse un std::string, verrebbe eseguito come execve(pathname.c_str(),...,...)?
Sailanarmo,

6

In realtà è abbastanza facile da sapere. Se stai chiamando una funzione che accetta solo una stringa C ( char*/ const char*), allora hai bisogno di una stringa con terminazione null poiché questo è l'unico modo per sapere dove si trova quindi la fine della stringa.

Se invece hai una funzione che accetta una char*/ const char*più la dimensione, o solo due puntatori che segnano l'inizio e la fine dei dati, allora non hai bisogno di una stringa terminata nulla poiché hai / puoi ottenere la dimensione della stringa senza iterare in un terminatore nullo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.