2010-02-25 12 views
12

stieß ich auf einem subtilen Fehler vor ein paar Tagen, wo der Code in etwa so aussah:Was nützt es heutzutage für "Enden"?

war
ostringstream ss; 
int anInt(7); 

ss << anInt << "HABITS"; 
ss << ends; 
string theWholeLot = ss.str(); 

Das Problem, dass die ends ein wie "7HABITS\0" ‚\ 0‘ in die ostringstream so theWholeLot sahen tatsächlich ragte (dh eine null am Ende)

Nun war dies nicht gezeigt, weil theWholeLot dann benutzt wurde, um den const char * Teil zu nehmen string::c_str() verwenden, das bedeutete, dass die null maskiert war, da es nur ein Trennzeichen wurde. Wenn dies jedoch geändert wurde, um durchgehend Zeichenfolgen zu verwenden, bedeutete der Nullwert plötzlich etwas und Vergleiche wie zum Beispiel:

würde fehlschlagen. Das hat mich denken lassen: Vermutlich ist der Grund für ends ein Rückfall zu den Tagen ostrstream, wenn der Strom normalerweise nicht mit einer Null beendet wurde und so sein musste, dass str() (die dann keine string sondern eine char * ausstrahlte) richtig funktionieren würde .

Aber jetzt, dass es nicht möglich ist, eine char * von einem ostringstream auszutreiben, ends Verwendung ist nicht nur überflüssig, sondern potenziell gefährlich und ich überlege sie alle von meinen Kunden Code zu entfernen.

Kann jemand einen offensichtlichen Grund sehen, ends in einer std::string einzigen Umgebung zu benutzen?

+0

Meine einzige Frage wäre, was ist eine std :: string nur Umgebung? Jedes nicht-triviale Programm wird char * Systemaufrufargumente, etc. sagen. That sagte, es gibt ein halbes Dutzend andere Weisen, damit umzugehen und Enden hat vernachlässigbare Nützlichkeit. – Duck

+0

Hier ist eine Verwendung von 'std :: endet': http://stackoverflow.com/questions/624260/how-to-reuse-an-ostringstream/624291#624291 –

+1

Es ist nicht nur für Strings. Es ist nützlich für allgemeine Streams. Einige Unix-Tools benötigen null Bytes als Abschlusszeichen. 'cout << endet;' wird ihnen zur Verfügung stellen. –

Antwort

7

Sie haben im Wesentlichen beantwortet Ihre eigene Frage ist so viel Detail, das benötigt wird. Ich kann sicherlich keinen Grund denken, std::ends zu verwenden, wenn std::string und std::stringstream alles für Sie behandeln.

Also, um Ihre Frage explizit zu beantworten, nein, gibt es keinen Grund, std::ends in einer std::string einzigen Umgebung zu verwenden.

+0

Ich würde sagen, dass es keinen Grund gibt, 'std :: ends 'zu verwenden. Ich würde sagen, ich bin ein sehr erfahrener C++ - Programmierer und wusste nicht einmal, dass es existiert. –

+3

@Andreas, weil du das erste Mal davon gehört hast, hörst du dich ganz sicher davon an :) –

+1

Wie Johannes darauf hingewiesen hat, gibt es genügend Gründe. Viele UNIX-Programme benötigen den gemeinsamen '\ 0'-Terminator, z. um Text mit ASCII-Zeichen <= 32 in andere Programme zu leiten. Ich kann mir ein Leben ohne 'find -print0',' xargs -null' oder 'read-d \ 'nicht vorstellen, um nur einige zu nennen. Auch viele APIs benötigen '\ 0'. Es ist der übliche String-Terminator, und Strings sind die wichtigsten Datenelemente, da alles in eine Zeichenkette umgewandelt werden kann. Daher möchten Sie, dass Strings so flexibel wie möglich sind. –

6

Es gibt einige APIs, die ein "string array" mit mehreren null terminierten Strings erwarten, eine doppelte Null, um das Ende zu markieren. Raymond Chang vor kurzem blogged about it, vor allem zu demonstrieren, wie oft das wird gefummelt.

+0

Ordentlich. Danke für den Link. –

Verwandte Themen