una título que para name metadatos keywords etiquetas etiqueta description descripción descripcion buscadores c++ c char unsigned

c++ - título - ¿Cómo determinas la longitud de un carácter sin firmar*?



que es una meta descripcion en wordpress (6)

¿Quieres la longitud del puntero, que sería un int. Si desea la longitud de la cadena a la que se apunta, use strlen: por ejemplo, Tamaño del puntero: sizeof (unsigned char *) Tamaño de la cadena: strlen (unsigned char *) Los caracteres multibyte se informarán como ... byte múltiple

¿Cómo determinas la longitud de un carácter sin firmar *?


En un mundo ideal, no lo haces. Utiliza char * para las cadenas de estilo C (que están terminadas en NUL y puede medir la longitud de), y char * sin signo solo para los datos de bytes (que vienen con su longitud en otro parámetro o lo que sea, y que probablemente obtenga) un contenedor STL lo antes posible, como vector<unsigned char> o basic_string<unsigned char> ).

El problema raíz es que no puede hacer suposiciones portátiles sobre si las representaciones de almacenamiento de char y unsigned char son las mismas. Por lo general son, pero se les permite no ser. Por lo tanto, no hay funciones de biblioteca de tipo cadena que funcionen en char * sin firma, solo en char *, y en general no es seguro convertir char * sin firma en char * firmado y tratar el resultado como una cadena. Dado que char podría estar firmado, esto significa que no se lanzará char * sin firmar a char *.

Sin embargo, 0 es siempre la misma representación de valor en unsigned char y char. Entonces, en un mundo no ideal, si tienes una cadena de estilo C de algún lugar pero ha llegado como un personaje sin firma *, entonces (a) lo conviertes en personaje de char * y sigues con él, pero también (b ) averigüe quién le hizo esto y pídales que se detengan.


Para el tamaño real del puntero:

size_t s = sizeof(unsigned char*);

Si quieres la longitud de la cadena:

unsigned char* bla = (unsigned char*)"blabla"; int s = strlen((char*)bla);


Podría haber dos significados para esto. ¿Quieres saber qué tan grande es el tipo de puntero? Si es así, entonces la respuesta de Joce es correcta.

size_t size = sizeof(unsigned char*);

Si quieres saber a cuántos elementos apunta el puntero, eso es un poco más complejo. Si esta es una cadena de estilo C, entonces strlen o alguna variante es su mejor opción.

Sin embargo, si esto es solo un puntero a un carácter sin signo que no tiene relación con una cadena de estilo C, entonces no hay manera de lograr de manera confiable lo que está buscando. C / C ++ no asocia un campo de longitud con un puntero. Deberá pasar la longitud con el puntero o usar un vector de tipo clase que almacene tanto el puntero como la longitud.


Por carácter sin signo * Supongo que se refiere a la cadena que se encuentra en ese puntero. En ese caso sería:

strlen(your_string_pointer)

Sin embargo, esto solo encontrará la posición / 0. No hay garantía de que este sea el tamaño real del bloque de memoria asignado.


Si estás usando C ++, y es una cadena en un carácter sin firma *, es mejor que lo pongas en una cadena std :: antes de manipularla. De esa manera, puedes hacer todo tipo de cosas y aún así ser capaz de obtener la longitud () y / o la capacidad () cuando lo desees.

Supongo que estás haciendo cosas a dicha matriz para hacer que su tamaño no sea constante. Si solo está asignando, configurando y olvidando, siempre puede almacenar el tamaño de la asignación real de la matriz en una variable separada, o mejor, hacer una estructura / clase.

//WARNING: memory issues not addressed here. struct myStringStruct { unsigned char * string; int len; allocate(int size) { len = size; string = malloc(sizeof(unsigned char) * len); } }

Más complejo que eso y estás reinventando std :: string.