2011-01-11 6 views
3

BetrachtenWarum in der Mitte des std String null Einstellung hat keine Wirkung

#include <string> 
#include <iostream> 

int main() 
{ 
    /* 
    hello 
    5 
    hel 
    3 
    */ 
    char a[] = "hello"; 
    std::cout << a << std::endl; 
    std::cout << strlen(a) << std::endl; 
    a[3] = 0; 
    std::cout << a << std::endl; 
    std::cout << strlen(a) << std::endl; 

    /* 
    hello 
    5 
    hel o 
    5 
    */ 
    std::string b = "hello"; 
    std::cout << b << std::endl; 
    std::cout << b.length() << std::endl; 
    b[3] = 0; 
    std::cout << b << std::endl; 
    std::cout << b.length() << std::endl; 

    getchar(); 

} 

Ich erwarte, dass std::string einen identisch char Array verhalten wird. Das ist es, fügen Sie Null Zeichen in der Mitte der Zeichenfolge ein, wird die Zeichenfolge "terminieren". Dies ist jedoch nicht der Fall. Ist meine Erwartung falsch?

Antwort

9

Ein std::string ist nicht wie eine normale C-Zeichenfolge und kann eingebettete NUL-Zeichen ohne Probleme enthalten. Wenn Sie dies jedoch tun, werden Sie feststellen, dass die Zeichenfolge vorzeitig beendet wird, wenn Sie die .c_str()-Funktion verwenden, um eine const char * zurückzugeben.

0

Ja, Ihre Erwartungen sind falsch. std::string ist gemeint, um sich von C-Strings zu unterscheiden (z. B. nicht notwendigerweise in aufeinanderfolgendem Speicher/einem Array gespeichert).

Um das Verhalten des ersten Abschnitts zu duplizieren, versuchen Sie std::cout << b.c_str() anstelle von std::cout << b.

+1

Können wir nicht endlich auf die Theorie verzichten, dass irgendjemand jemals 'string' mit nicht-zusammenhängendem Speicher implementieren wird? C++ 0x bringt es in Einklang mit 'vector'. –

+0

Mit diesem Kommentar könnten Sie jemanden dazu bringen, es tatsächlich zu tun. – foo

2

Nein - std::string s sind nicht NUL-terminiert wie C "strings"; Der std :: string zeichnet seine Länge unabhängig auf.

1

@Lou ist richtig: tun Sie das nicht. Stattdessen tun:

b.erase (3, b.length()); 
0

Ich erwarte, dass std :: string identisch verhalten wird ein char-Array.

Warum? Nichts in der Dokumentation irgendwo mit std :: string sagt, dass es das tut.

Mein Vorschlag, aufhören zu behandeln wie C++ als C plus einige Sachen.

Verwandte Themen