usar que puedo poner para libreria imprimir dev declarar como c++ stdstring c-strings null-terminated

c++ - que - ¿Puede std:: string contener nulos incorporados?



string en dev c++ (4)

Puedes, pero ¿por qué querrías? Incrustar NUL en std :: string es solo un problema, porque las funciones a las que pasas std :: string pueden usar su miembro c_str (), y la mayoría supondrá que el primer NUL indica el final de la cadena. Por lo tanto, esta no es una buena idea para hacer. También tenga en cuenta que en UTF-8, solo ''/ 0'' dará como resultado un 0, por lo que incluso para propósitos i18n, no hay justificación para incrustar NUL.

Para cadenas de C regulares, un carácter nulo ''/0'' significa el final de los datos.

¿Qué pasa con std::string , puedo tener una cadena con caracteres nulos incrustados?


Sí, esto es válido.

Puede tener un carácter nulo en el medio de la cadena.

Sin embargo, si usas std :: string con un carácter nulo en el medio con una cadena de caracteres, actúas en un pueblo de comportamiento indefinido, ¡y nadie quiere estar allí!

int n = strlen( strWithNullInMiddle.c_str() ); // Boom!!!


Sí, puede tener nulos incrustados en su std::string .

Ejemplo:

std::string s; s.push_back(''/0''); s.push_back(''a''); assert(s.length() == 2);

Nota: el miembro c_str() std::string siempre agregará un carácter nulo al búfer char devuelto; Sin embargo, el miembro data() std::string puede o no agregar un carácter nulo al buffer char devuelto.

Tenga cuidado con el operador + =

Una cosa a tener en cuenta es no usar operator+= con un char* en el RHS. Solo se sumará hasta el carácter nulo.

Por ejemplo:

std::string s = "hello"; s += "/0world"; assert(s.length() == 5);

La forma correcta:

std::string s = "hello"; s += std::string("/0world", 6); assert(s.length() == 11);

Almacenar datos binarios más comunes para usar std :: vector

En general, es más común usar std::vector para almacenar datos binarios arbitrarios.

std::vector<char> buf; buf.resize(1024); char *p = &buf.front();

Probablemente sea más común dado que los miembros de std::string data() y c_str() devuelven punteros const para que la memoria no sea modificable. con & buf.front () puede modificar directamente el contenido del búfer.


Sí. Una std :: string es solo un vector<char> con beneficios.

Sin embargo, tenga cuidado de pasar tal bestia a algo que llame a .c_str() y se detenga en el 0.