Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Obtener tamaño array dinámico

Estas en el tema de Obtener tamaño array dinámico en el foro de C/C++ en Foros del Web. Hola Mi problema es el siguiente, estoy haciendo un programa en el cual necesito tener la cantidad de carácteres de un array del tipo char. ...
  #1 (permalink)  
Antiguo 23/03/2008, 22:30
Avatar de Hardrive  
Fecha de Ingreso: julio-2006
Ubicación: La Plata - Bs. As.
Mensajes: 65
Antigüedad: 18 años, 5 meses
Puntos: 0
Obtener tamaño array dinámico

Hola

Mi problema es el siguiente, estoy haciendo un programa en el cual necesito tener la cantidad de carácteres de un array del tipo char. El problema es que el contenido de la variable incluye '\0', por lo cual se complica. Es decir, que necesito obtener el tamaño de este tipo de array:
Cita:
char cadena[] = "cadena\0\0\0"
Si hago un sizeof a la variable luego de declararla, obtengo el tamaño + 1 byte. Ahora, si paso el array a otra función, en esa función sizeof no funciona (me devuelve 4, el tamaño de un char). Como verán no puedo usar strlen ya que me estaría comiendo carácteres (los '\0' del final) y he aquí mi problema.

Espero que alguien me ayude. Gracias de antemano.


Salu2
  #2 (permalink)  
Antiguo 24/03/2008, 06:24
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 10 meses
Puntos: 22
Re: Obtener tamaño array dinámico

Que tal.

Cita:
Si hago un sizeof a la variable luego de declararla, obtengo el tamaño + 1 byte.
Al iniciar el arreglo como un string obtienes un caracter '\0' de mas.

Código:
char cadena[] = {'c', 'a', 'd', 'e', 'n', 'a', '\0', '\0', '\0'};
// sizeof cadena retorna 9 
Un saludo.
  #3 (permalink)  
Antiguo 24/03/2008, 14:18
Avatar de Hardrive  
Fecha de Ingreso: julio-2006
Ubicación: La Plata - Bs. As.
Mensajes: 65
Antigüedad: 18 años, 5 meses
Puntos: 0
Re: Obtener tamaño array dinámico

Cita:
Iniciado por fightmx Ver Mensaje
Al iniciar el arreglo como un string obtienes un caracter '\0' de mas..
Si gracias, eso ya lo sé, pero el problema es que cuando paso el array a otra función, y le hago un sizeof me devuelve 4, es decir, el tamaño de un char solo. Lo que necesitaría es que me devuelva el tamaño de la cadena entera incluida los '\0\0\0', no importa si me devuelve un byte de más.


Salu2
  #4 (permalink)  
Antiguo 24/03/2008, 16:05
Avatar de Mephisto  
Fecha de Ingreso: enero-2006
Ubicación: Mexico DF
Mensajes: 184
Antigüedad: 19 años
Puntos: 3
Re: Obtener tamaño array dinámico

Por que no en lugar de enviar el array a la función, envías un apuntador a tu array... Cuando envias directamente el array lo que se generá es una copia y es la que se emplea en tu función, por eso le recorta los nulos...
__________________
Saludos...

Todos somos sabios, solo que en diferentes disciplinas...
  #5 (permalink)  
Antiguo 24/03/2008, 17:09
Avatar de Hardrive  
Fecha de Ingreso: julio-2006
Ubicación: La Plata - Bs. As.
Mensajes: 65
Antigüedad: 18 años, 5 meses
Puntos: 0
Re: Obtener tamaño array dinámico

Hola

Yo para pasar el array a la función básicamente lo que hago es esto:
Cita:
int main()
{
char cadena[] = "cadena\0\0\0"
funcion(cadena)
}

void funcion(char array[])
{
cout << array; //muestra la cadena correctamente

cout << sizeof(array); //esto me devuelve 4, en vez de 10, que es lo que deberia

cout << strlen(array); //devuelve 6, en vez de 9 (saltea los '\0')
}

Creo que ahí queda más claro a lo que me refiero.


Espero que alguien sepa como resolverlo.
  #6 (permalink)  
Antiguo 24/03/2008, 17:46
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 10 meses
Puntos: 22
Re: Obtener tamaño array dinámico

Cita:
Si gracias, eso ya lo sé, pero el problema es que cuando paso el array a otra función, y le hago un sizeof me devuelve 4, es decir, el tamaño de un char solo.
En realidad 4 bytes es el tamaño que ocupa el puntero en memoria y no el tamaño de un char, lo que sucede aquí es que cuando pasas el arreglo a una función este es tratado como un puntero (independientemente de la notación que utilices en el header de la función, esto es, puede ser (char *p) ó (char p[]) por ejemplo), de esta forma siempre que utilices sizeof p dentro de la función obtendrás el tamaño de un char* y no el tamaño del arreglo de caracteres. Puedes utilizar un segundo parámetro en la función que especifique el tamaño del arreglo, por ejemplo:
Código:
void myfunc(char *array, int size); // declaración 
myfunc(myarray, sizeof myarray/sizeof myarray[0]);  // llamada de la función
Salu2.
  #7 (permalink)  
Antiguo 24/03/2008, 21:34
Avatar de Hardrive  
Fecha de Ingreso: julio-2006
Ubicación: La Plata - Bs. As.
Mensajes: 65
Antigüedad: 18 años, 5 meses
Puntos: 0
Re: Obtener tamaño array dinámico

Gracias he investigado y es como ustedes dicen, por lo cual ahora le he implementado el segundo parámetro.

Además he hecho una función que transforme el carácter ■ al carácter '\0", de modo que ahora puedo utilizar todo con más presición, e incluso mandar carácteres nulos desde el teclado, con un cin o un scanf.

Gracias, me han servido de mucho sus consejos, pueden dar el tema por solucionado.



Salu2
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 1 personas (incluyéndote)




La zona horaria es GMT -6. Ahora son las 17:59.