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.