Saltar al contenido

Cómo obtener la longitud real y total de char * (char array)?

Haz todo lo posible por interpretar el código de forma correcta previamente a aplicarlo a tu trabajo si tdeseas aportar algo puedes comentarlo.

Solución:

no puedes No con 100% de precisión, de todos modos. el puntero no tiene longitud/tamaño sino su propio. Todo lo que hace es apuntar a un lugar particular en la memoria que contiene un char. Si ese char es parte de un stringentonces puedes usar strlen para determinar qué caracteres siguen al que se está señalando actualmente, pero eso no significa que el array en tu caso es así de grande.
Básicamente:

A puntero no es un arraypor lo que no necesitar para saber cual es el tamaño array es. Un puntero puede apuntar a un solo valor, por lo que un puntero puede existir sin que haya siquiera un array. Ni siquiera le importa dónde se encuentra la memoria a la que apunta (solo lectura, montón o pila… no importa). Un puntero no tiene una longitud distinta de sí mismo. Un puntero simplemente es…
Considera esto:

char beep = 'a';
void alert_user(const char *msg, char *signal); //for some reason
alert_user("Hear my super-awsome noise!", &beep); //passing pointer to single char!

void alert_user(const char *msg, char *signal)

    printf("%s%cn", msg, *signal);

Un puntero puede ser un solo carácter, así como el principio, el final o la mitad de un array…
Piense en los caracteres como estructuras. A veces asigna una sola estructura en el montón. Eso también crea un puntero sin un array.

Usando solo un puntero, para determinar qué tan grande es array está apuntando es imposible. Lo más cerca que puedes llegar es usando calloc y contando el número de caracteres consecutivos que puede encontrar a través del puntero. Por supuesto, eso no funciona una vez que haya asignado/reasignado cosas a ese array’s keys y también falla si la memoria acaba fuera de del array pasa a sostener , también. Por lo tanto, usar este método no es confiable, es peligroso y, en general, es una tontería. No. Hacer. Eso.

Otra analogía:

Piense en un puntero como una señal de tráfico, apunta a Ciudad X. El letrero no sabe cómo es ese pueblo, y no sabe ni le importa (o puede importarle) quién vive allí. Su trabajo es decirte dónde encontrar Ciudad X. Solo puede decirte qué tan lejos está ese pueblo, pero no qué tan grande es. Esa información se considera irrelevante para las señales de tráfico. Eso es algo que solo puedes descubrir mirando la ciudad en sí, no las señales de tráfico que te señalan en su dirección.

Entonces, usando un puntero, lo único que puedes hacer es:

char a_str[] = "hello";//h,e,l,l,o,
char *arr_ptr = &a_str[0];
printf("Get length of string -> %dn", strlen(arr_ptr));

Pero esto, por supuesto, sólo funciona si el array/string está terminado en .

Como un aparte:

int length = sizeof(a)/sizeof(char);//sizeof char is guaranteed 1, so sizeof(a) is enough

en realidad está asignando size_t (el tipo de retorno de sizeof) a una intmejor escribe:

size_t length = sizeof(a)/sizeof(*a);//best use ptr's type -> good habit

Ya que size_t es un tipo sin firmar, si sizeof devuelve valores más grandes, el valor de length puede ser algo que no esperabas…

Si el char * es 0-terminado, puede utilizar strlen

De lo contrario, no hay forma de determinar esa información.

Solo hay dos formas:

  • Si el puntero de memoria a por su char * representa una C string (es decir, contiene caracteres que tienen un byte 0 para marcar su final), puede usar strlen(a).

  • De lo contrario, debe almacenar la longitud en algún lugar. En realidad, el puntero solo apunta a unachar. Pero podemos tratarlo como si apuntara al primer elemento de un array. Dado que la “longitud” de ese array no se sabe que necesita almacenar esa información en alguna parte.

Sección de Reseñas y Valoraciones

Ten en cuenta dar visibilidad a esta división si te valió la pena.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *