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.