library length array c++ c++11 stdstring string-length

length - string library c++



¿Por qué std:: string(“/ x00”) informa la longitud de 0? (3)

Tengo una función que necesita codificar cadenas, que debe poder aceptar 0x00 como un ''byte'' válido. Mi programa necesita verificar la longitud de la cadena, sin embargo, si paso "/x00" a std::string el método length() devuelve 0.

¿Cómo puedo obtener la longitud real incluso si la cadena es un solo carácter nulo?


Con C ++ 14, puede usar un operador literal de cadena para almacenar cadenas con bytes nulos:

using namespace std::string_literals; std::string a = "/0"s; std::string aa = "/0/0"s; // two null bytes are supported too


Estás pasando en una cadena vacía. Use std::string(1, ''/0'') lugar.

O std::string{ ''/0'' } (gracias, @ zett42)


std::string es perfectamente capaz de almacenar nulos. Sin embargo, debes tener cuidado, ya que const char* no lo es, y construyes brevemente un const char* , desde el cual creas la std::string .

std::string a("/x00");

Esto crea una cadena C constante que contiene solo el carácter nulo, seguido de un terminador nulo. Pero las cuerdas C no saben cuánto tiempo tienen; así que la cadena piensa que se ejecuta hasta el primer terminador nulo, que es el primer carácter. Por lo tanto, se crea una cadena de longitud cero.

std::string b(""); b.push_back(''/0'');

std::string es nulo-limpio. Los caracteres ( /0 ) también pueden ser de cero bytes libremente. Entonces, aquí, no hay nada que nos impida leer correctamente la estructura de datos. La longitud de b será 1 .

En general, debe evitar construir cadenas C que contengan caracteres nulos. Si lee la entrada de un archivo directamente en std::string o se asegura de insertar los caracteres uno por uno, puede obtener el resultado que desea. Si realmente necesita una cadena constante con caracteres nulos, considere usar algún otro carácter centinela en lugar de /0 y luego (si realmente lo necesita) reemplace esos caracteres con ''/0'' después de cargar en std::string .