"bug" nel testo C ++ 11 di Stroustrup?

1

Ho trovato un'apparente contraddizione nel testo c ++ che ha a che fare con il risultato della funzione c_str() che opera su std:strings (nella mia copia, la definizione e la contraddizione sono su p1040).

In primo luogo definisce la funzione c_str() come qualcosa che produce una stringa 'C-style' (a terminazione zero), ma in seguito parla di come un valore c_str di C ++ può aver incorporato un 'C'-style, end- di terminatori di stringa (es. NUL) incorporati nella stringa (definita dal fatto che NUL è stato terminato).

Um ... qualcun altro ritiene che questo sia un "allungamento" della definizione di una C-string oltre la sua definizione? Cioè Penso che ciò significhi, se osservassi la funzione length() applicata a string , mostrerà una diversa fine della stringa rispetto all'utilizzo della definizione C di una stringa z, una che può contenere qualsiasi carattere tranne NUL, ed è terminato da NUL.

Probabilmente non mi devo preoccupare nei miei programmi, ma sembra una sottile distinzione che rende un C ++ c_str , non proprio un 'C' -stringa. Sto fraintendendo questo problema?

Grazie!

    
posta Astara 28.05.2014 - 21:28
fonte

2 risposte

6

La funzione c_str restituisce un puntatore ai contenuti della stringa, assicurando che i dati siano seguiti da un carattere NUL (zero).

┌─────────────data─────────────┐ end
48 65 6C 6C 6F 20 77 6F 72 6C 64 00
H  e  l  l  o  ␠   w  o  r  l  d  ␀

Tuttavia, i dati della stringa stessa possono contenere un carattere NUL. (Ciò è possibile perché std::string deve memorizzare la sua lunghezza esplicitamente anziché dipendere dalla terminazione null.) Quando ciò accade, strlen(str.c_str()) restituirà un valore inferiore a str.length() .

┌─────────────data─────────────┐ end
48 65 6C 6C 6F 00 77 6F 72 6C 64 00
H  e  l  l  o  ␀   w  o  r  l  d  ␀
└────────────┘
 string seen by strlen() etc.

Quanto sopra è l'equivalente di fare strlen("Helloc_str()world") in C. La stringa vista dalla funzione C è una sottostringa sinistra della stringa originale.

A volte questo causa la perdita di dati o anche un rischio per la sicurezza , ma cos'altro potrebbe fare %code% in questa situazione?

    
risposta data 29.05.2014 - 02:32
fonte
3

In C, NULL è uguale a 0x00. O null è uguale a zero.
E per essere chiari, NUL è un nome equivalente di NULL .

Quindi il testo di Stroustrup è corretto su come C ++ c_str è terminato.

Fornire un po 'più di contesto. È prassi abbastanza comune in C memorizzare un array di caratteri dopo averlo creato per assicurarsi che sia terminato con null.

char foo[20];
memset(foo, 0x00, 20);
strlen(foo);  /* Should return 0 */

Per favore perdonami se la mia sintassi è un po 'off. E per l'uso di numeri magici.

    
risposta data 28.05.2014 - 21:33
fonte

Leggi altre domande sui tag