2011-07-14 18 views
5

Tengo una cadena cuya última parte (sufijo) debe cambiarse varias veces y necesito generar nuevas cadenas. Estoy tratando de usar ostringstream para hacer esto, como creo, el uso de secuencias será más rápido que las concatenaciones de cadenas. Pero cuando el sufijo anterior es mayor que el anterior, se arruina. La secuencia también elimina los caracteres nulos.¿Por qué la tira ostringstream NULL?

#include<iostream> 
#include<sstream> 

using namespace std; 

int main() 
{ 
    ostringstream os; 
    streampos pos; 
    os << "Hello "; 
    pos = os.tellp(); 
    os << "Universe"; 
    os.seekp(pos); 
    cout<< os.str() << endl; 
    os << "World\0"; 
    cout<< os.str().c_str() << endl; 
    return 0; 
} 

salida

Hello Universe 
Hello Worldrse 

Pero quiero Hello World. ¿Cómo hago esto? ¿Hay alguna otra manera de hacer esto de una manera más rápida?

Editar: Apendice std::ends funciona. Pero me pregunto cómo funciona internamente. También me gustaría saber si hay formas más rápidas de hacer lo mismo.

+1

No tan seguro de que stringstream será el más eficiente - usted debe considerar una de las variantes del 'std :: string: : replace() ' – Nim

Respuesta

3

No tira nada. Todos los literales de cadena en C++ son terminados por NUL, por lo que al insertar uno manualmente termina la cadena, en lo que concierne a cualquier proceso. Use ostream::write o ostream::put, si necesita hacer eso, cualquier cosa que espere char* (sin un argumento adicional para el tamaño) muy probablemente lo tratará especialmente.

os.write("World\0", 6); 
9

La cadena "World" ya tiene terminación nula. Así es como funcionan las cadenas C. "World \ 0" tiene dos caracteres \0. Por lo tanto, operator<<(ostream&, const char*) los tratará igual, y copiará todos los caracteres hasta \0. Puedes ver esto incluso más claramente, si pruebas os << "World\0!". El ! no se copiará en absoluto, ya que operator<< se detuvo en el primer \0.

Por lo tanto, no es ostringstream. Así es como funcionan las cadenas C aka const char*.

0

¿Por qué crees que la operación de una secuencia es más rápida que una cadena? ¿Y por qué construir la cadena antes de enviar a cout?

Si desea un prefijo a su salida sólo podría hacerlo de esta manera

const std::string prefix = "Hello "; 

std::cout << prefix << "Universe" << std::endl; 
std::cout << prefix << "World" << std::endl; 
Cuestiones relacionadas