2010-02-25 11 views
12

me encontré con un error sutil hace un par de días en que el código se veía algo como esto:¿Qué uso hay para los 'fines' en estos días?

ostringstream ss; 
int anInt(7); 

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

El problema era que el ends sobresalía un '\ 0' en la ostringstream por lo theWholeLot realidad parecía "7HABITS\0" (es decir, un valor nulo al final)

Ahora bien, esto no se había presentado porque theWholeLot entonces estaba siendo utilizada para tomar la parte const char * usando string::c_str() eso quiere decir que el nulo fue enmascarado como se hizo sólo un delimitador. Sin embargo, cuando esto cambió a usar cadenas en todas partes, la nula intención de repente algo y comparaciones como:

if (theWholeLot == "7HABITS") 

fracasarían. Esto me hizo pensar: Presumiblemente, el motivo de ends es un retroceso a los días de ostrstream cuando la secuencia normalmente no terminaba con un valor nulo y tenía que ser tal que str() (que luego arrojaba no string sino un char *) funcionara correctamente .

Sin embargo, ahora que no es posible echar fuera un char * de un ostringstream, utilizando ends no sólo es superfluo, pero potencialmente peligroso y estoy considerando la eliminación de todos ellos desde mi código clientes.

¿Alguien puede ver una razón obvia para usar ends en un entorno único de std::string?

+0

Mi única objeción sería ¿qué es un entorno std :: string only? Cualquier programa no trivial va a char * argumentos de llamadas al sistema, etc. Dicho esto, hay media docena de otras maneras de lidiar con eso y los fines tienen una utilidad insignificante. – Duck

+0

Aquí hay algunos usos de 'std :: ends': http://stackoverflow.com/questions/624260/how-to-reuse-an-ostringstream/624291#624291 –

+1

No es solo para cadenas. Es útil para transmisiones generales. Algunas herramientas de Unix necesitan bytes nulos como terminadores. 'cout << ends;' se los proporcionará. –

Respuesta

7

Básicamente ha respondido que su propia pregunta es la cantidad de detalles que se necesita. Ciertamente no puedo pensar en ninguna razón para usar std::ends cuando std::string y std::stringstream manejan todo eso para usted.

lo tanto, para responder a su pregunta de forma explícita, no, no hay ninguna razón para utilizar std::ends en un único entorno std::string.

+0

Diría que no hay ninguna razón para usar el período 'std :: ends'. Diría que soy un programador de C++ con mucha experiencia y, sin embargo, ni siquiera sabía que existía. –

+3

@Andreas, por haber escuchado al respecto la primera vez, suenas extraordinariamente seguro al respecto :) –

+1

Como señaló Johannes, hay suficientes razones. Muchos programas UNIX requieren el terminador '\ 0' común, p. para canalizar texto con caracteres ASCII <= 32 en otros programas. Ni siquiera puedo imaginar una vida sin 'encontrar -print0',' xargs -null' o 'read -d '\ 0'', solo por nombrar algunos. También muchas API requieren '\ 0'. Es el terminador de cadena común, y las cadenas son los elementos de datos más importantes, ya que cualquier cosa se puede convertir en una cadena. Por lo tanto, desea que las cadenas sean lo más flexibles posible. –

6

Hay algunas API que esperan una "matriz de cadenas" con múltiples cadenas terminadas en cero, un doble cero para marcar el final. Raymond Chang hace poco blogged about it, sobre todo para demostrar la frecuencia con la que esto se confunde.

+0

aseado. Gracias por el enlace. –

Cuestiones relacionadas