elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Problema al pasar char* como parametro
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Problema al pasar char* como parametro  (Leído 4,610 veces)
HardForo

Desconectado Desconectado

Mensajes: 219


HardForo.com


Ver Perfil WWW
Problema al pasar char* como parametro
« en: 17 Abril 2016, 00:28 am »

Gente:

   Estaba leyendo como es calculo de longitud de un array y estaba seguro de que podia implementar una funcion del tipo strlen() para punteros a char pero me encontré con un problema inesperado:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. // longitud de un char*
  5. int charlen(char* x){
  6. return sizeof(x) / sizeof(x[0]);
  7. }
  8.  
  9. int main(void){
  10.  
  11. int i;
  12.  
  13. char x[]={'H','A','R','D','F','O','R','O'};
  14. const char *y = "HARDFORO";
  15.  
  16. for (i=0;i<sizeof(x) / sizeof(x[0]);i++)
  17. printf("%c",x[i]); // HARDFORO
  18.  
  19. printf("\n\n",x[i]);
  20.  
  21. for (i=0;i<strlen(y);i++)
  22. printf("%c",y[i]); // HARDFORO
  23.  
  24. }
  25.  

Si en vez de hacer en el main() la division sizeof(x) / sizeof(x[0]) la hago en una funcion, el resultado me varía (me da 4 y me temo sea basura y pueda dar otro valor)

Por qué ?



Código
  1. for (i=0;i<charlen(x);i++)
  2. printf("%c",x[i]); // HARD  <-- error
  3.  


« Última modificación: 17 Abril 2016, 00:31 am por boctulus » En línea

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Problema al pasar char* como parametro
« Respuesta #1 en: 17 Abril 2016, 00:36 am »

En C/C++ hay 2 tipos de arrays: los estáticos y los dinámicos, por así decirlo.
"char str[ 10 ]" sería  estático, es una variable de 10 bytes,
"char *str" sería dinámico, y realmente no es un array, sino un puntero a char.

Cuando le pasas un array estatico a la función, lo interpreta como simplemente un puntero. El tamaño de un puntero es de 4 bytes, y el tamaño de un char es de 1 byte (por lo general).
Así pues, 4/1 = 4. Ahí tu resultado, totalmente real.

Solo hay 2 formas reales de saber el tamaño de una cadena: o pasándoselo a las funciones (evidentemente, funciona siempre), o contando caracteres hasta encontrar un caracter nulo ('\0', funciona solo con cadenas de texto, no para binarias).
strlen lo que hace es contar hasta el caracter nulo.


En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problema al pasar char* como parametro
« Respuesta #2 en: 17 Abril 2016, 00:52 am »

Un array no es un puntero. Son dos tipos de objetos diferentes. C sabe el tamaño que tiene un array pues se lo has indicado pero un puntero puede apuntar a cualquier cosa y no hay información sobre lo que guarda. Por tanto el tamaño de un puntero tan solo te devolverá el tamaño de la palabra del procesador.

Así mientras tengas la declaración del array a la vista de sizeof éste sabrá que tamaño tiene, en cuánto lo referencies con un puntero habrás terminado con ese dato.

¿Qué quiere decir eso?
Si declaras el array de forma global, fuera de toda función, a partir de ese momento todo el programa conocerá el tamaño del array.
Si declaras el array de forma local, dentro de una función, únicamente dentro de esa función se sabrá el tamaño de ese array.
En línea

HardForo

Desconectado Desconectado

Mensajes: 219


HardForo.com


Ver Perfil WWW
Re: Problema al pasar char* como parametro
« Respuesta #3 en: 17 Abril 2016, 01:07 am »

Les agradezco a ambos... en cierto punto entienden lo mismo... pero yo entiendo menos y aun menos cuando pruebo lo que interpreto  :laugh:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4.  
  5. int charlen(char* x){
  6. return sizeof(x) / sizeof(x[0]);
  7. }
  8.  
  9.  
  10. // Global variables
  11.  
  12. char x[]={'H','A','R','D','F','O','R','O'};
  13. const char *y = "HARDFORO";
  14.  
  15.  
  16. int main(void){
  17.  
  18. int i;
  19.  
  20.  
  21. for (i=0;i<charlen(x);i++)
  22. printf("%c",x[i]); // HARD <--- 4
  23.  
  24. printf("\n\n",x[i]);
  25.  
  26. for (i=0;i<strlen(y);i++)
  27. printf("%c",y[i]); // HARDFORO
  28.  
  29. }
  30.  

<-- los declaré globalmente

Lo que esta clarisimo es que pueden explicar ese 4 pero sera que me ayudan a que como funcion pueda determinar el tamaño del char* ?

Quiero aclarar que si uso strlen() obtengo basura:

Código
  1. for (i=0;i<strlen(x);i++)
  2. printf("%c",x[i]); // HARDFORO+á@
  3.  

<-- Hay basura al final ya que me reporta 11 de longitud
« Última modificación: 17 Abril 2016, 01:12 am por boctulus » En línea

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Problema al pasar char* como parametro
« Respuesta #4 en: 17 Abril 2016, 01:18 am »

Como digo, strlen solo funciona en cadenas que terminen en '\0'.
Este array: "char x[]={'H','A','R','D','F','O','R','O'};" no termina en caracter nulo, así que strlen seguirá sumando caracteres hasta encontrar uno.

Cuando pones: char x[] = "HARDFORO", esa cadena sí termina en caracter nulo. Las cadenas "" en C terminan en caracter nulo, aunque no se lo digas explícitamente.

Si vas a trabajar con caracteres como texto, evita inicializar con "{}".
En línea

MAFUS


Desconectado Desconectado

Mensajes: 1.603



Ver Perfil
Re: Problema al pasar char* como parametro
« Respuesta #5 en: 17 Abril 2016, 01:19 am »

En tu función charlen has ocultado identificador x que nombra el array, por lo que dentro de la función éste ya no se ve.
Realmente lo que te he dicho es falso pues el array x en el momento de la definición de la función no existe así que es imposible que C sepa el tamaño de éste.
Para que el programa funcione debes hacer los siguientes cambios.

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. // Global variables
  5.  
  6. char x[]={'H','A','R','D','F','O','R','O'};
  7. const char *y = "HARDFORO";
  8.  
  9. int charlen(){
  10. return sizeof(x) / sizeof(x[0]);
  11. }
  12.  
  13. int main(void){
  14.  
  15. int i;
  16.  
  17.  
  18. for (i=0;i<charlen();i++)
  19. printf("%c",x[i]); // HARDFORO
  20.  
  21.    putchar('\n');
  22.  
  23. for (i=0;i<strlen(y);i++)
  24. printf("%c",y[i]); // HARDFORO
  25. }
En línea

HardForo

Desconectado Desconectado

Mensajes: 219


HardForo.com


Ver Perfil WWW
Re: Problema al pasar char* como parametro
« Respuesta #6 en: 17 Abril 2016, 01:30 am »

@ivancea96: lo que dices tiene mucho sentido, gracias  ;D


@MAFUS: pero entonces esa funcion no seria muy util que digamos ? o sea no acepta parametros ?

Estoy sorprendido de que no se pueda abstraer un poco mas  >:(

Bueno... dejo planteado el problema por si se les ocurre algo y agradezco las explicaciones (a ambos)


En un acto de desespero...... he intentado usar punteros dobles pero fallo en algo (como raro yo) xD

Código
  1. #include <stdio.h>
  2.  
  3. // longitud de un char*
  4. int charlen(char** x){
  5. return sizeof(*x) / sizeof(*x[0]);
  6. }
  7.  
  8. int main(void){
  9.  
  10. int i;
  11.  
  12. char x[]={'H','A','R','D','F','O','R','O'};
  13.  
  14. for (i=0;i<charlen(&x);i++)
  15. printf("%c",x[i]);
  16.  
  17. }
  18.  

Lo podran mirar ? gracias
« Última modificación: 17 Abril 2016, 01:35 am por boctulus » En línea

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Problema al pasar char* como parametro
« Respuesta #7 en: 17 Abril 2016, 01:41 am »

Ya que C es programación estructurada, la forma de abstraerlo sería crear una estructura:
Código
  1. typedef struct String{
  2.    char* str;
  3.    unsigned int size;
  4. } String;
  5.  
  6. String makeString(char* data, unsigned int size){
  7.    String s;
  8.    s.size = size;
  9.    if(size==0)
  10.        s.size = strlen(data); // Para cadenas de texto
  11.    int i = 0;
  12.    for(; i<s.size; i++)
  13.        s.str[i] = data[i];
  14.    return s;
  15. }
  16.  
  17. // ...

Y luego haces todas las funciones que quieras para manejarlo.
Si programas C++, esto lo tendrás muy fácil con clases. De hecho, ya está en la librería estándar de C++ la clase "string".
En línea

HardForo

Desconectado Desconectado

Mensajes: 219


HardForo.com


Ver Perfil WWW
Re: Problema al pasar char* como parametro
« Respuesta #8 en: 17 Abril 2016, 01:46 am »

Gracias Ivan, entonces supongo que o hago in situ el sizeof(x)/sizeof(x[0]) o me se el valor por anticipado o uso strings :)

Gracias
« Última modificación: 17 Abril 2016, 02:06 am por boctulus » En línea

HardForo:  foro de Hardware y programación

Se buscan Mods y colaboradores *
ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: Problema al pasar char* como parametro
« Respuesta #9 en: 17 Abril 2016, 01:49 am »

Gracias Ivan, entonces supongo que o hago inline el sizeof(x)/sizeof(x[0]) o me se el valor por anticipado o uso strings :)

Gracias

strlen es una opción, la más común y útil para texto, siempre que uses la inicialización vía " " y no con { ... }.
En línea

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines