La prima cosa da notare è che std::string
non ha un costruttore che può dedurre la lunghezza di una stringa letterale dall'array sottostante. Quello che ha è un costruttore che accetta uno const char*
e lo considera come una stringa con terminazione nulla. In tal modo, copia i caratteri fino a quando non trova il primo \0
.
Questo è il costruttore utilizzato in string m = "0100700\0";
, che è il motivo per cui nel primo caso la stringa è di lunghezza 7. Si noti che non c'è altro modo per ottenere la lunghezza di un array di caratteri da un puntatore al suo primo elemento.
Nel secondo esempio, si aggiunge un carattere a un oggetto preesistente std::string
di lunghezza 7. Ciò aumenta la lunghezza a 8. Se si dovesse scorrere su tutti gli elementi della stringa, si sarebbe in grado di vederlo questo ottavo elemento è '\0'
.
for (auto c: n)
if (c == 0) std::cout << "null terminator" << std::endl;
per inizializzare una stringa contenente '\0'
caratteri, avete opzioni:
utilizzare un elenco di inizializzazione:
std::string s{'a', 'b', '\0', 'd', 'e', '\0', 'g'};
Construct da un contenitore o una matrice diversa usando std::string
's costruttore iteratore :
std::vector<char> v{'a', 'b', '\0', 'd', 'e', '\0', 'g'};
char c[] = {'a', 'b', '\0', 'd', 'e', '\0', 'g'};
const char* ps = "ab\0de\0g";
std::string s0(std::begin(v), std::end(v));
std::string s1(std::begin(c), std::end(c));
std::string s2(ps, ps + 8);
Non è necessario il carattere null esplicito poiché è già presente. –
Mi dispiace per la domanda duplicata. Da ora provo a risolvere la mia domanda cercando più attentamente. – carrot031