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

 

 


Tema destacado: Los 10 CVE más críticos (peligrosos) de 2020


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ejercicios en c
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: ejercicios en c  (Leído 11,406 veces)
fantasma306

Desconectado Desconectado

Mensajes: 28



Ver Perfil
Re: ejercicios en c
« Respuesta #10 en: 16 Junio 2011, 16:14 pm »

Código
  1. int strlen(char *cadena)
  2. {
  3. char *ptr = cadena;
  4.  
  5. while(*ptr++);
  6. *ptr--;
  7.  
  8. return ptr - cadena;
  9. }

le pasa la direccion de donde empieza la cadena.
digamos que la cadena esta en la direccion :70
cadena es un puntero, luego crea otro puntero y le pone la misma direccion que cadena es decir 70

(digamos que la cadena es "HOLA")
va imcrementando ptr hasta el fin de la cadena, al final del bucle ptr vale 75(4 letras + 1, el caracter '\0')
luego desincrementa ptr para que tenga la direccion 74; (es decir justo las 4letras)
y luego resta 74-70= y devuelve el resultado, 4, justo el numero de letras que tiene la cadena.

saludos


En línea

Es mejor callar y que piensen que eres idiota a hablar y demostrarlo.
Queta

Desconectado Desconectado

Mensajes: 267



Ver Perfil
Re: ejercicios en c
« Respuesta #11 en: 16 Junio 2011, 17:42 pm »

Bueno, el tema se complica si me dijiste que has empezado con C/C++ hace cosa de un mes. En el código estoy manejando cadenas y punteros:

http://www.cplusplus.com/doc/tutorial/arrays/
http://www.cplusplus.com/doc/tutorial/pointers/

Antes de que te lo explique, déjame mencionarte que en:

Código
  1. int strlen(char *cadena)

char *cadena es simplemente un parámetro. Si utilizásemos esta función deberíamos pasar una cadena, un array, al parámetro llamado cadena, ¿entiendes? Mira esto para más información:

http://www.cplusplus.com/doc/tutorial/functions/
http://www.cplusplus.com/doc/tutorial/functions2/

A lo que iba, cuando hayas estudiado cadenas y punteros entenderás que (supongamos el siguiente ejemplo):

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main()
  5. {
  6. char string[] = "Hola";
  7.  
  8. char *ptr = string;
  9.  
  10. printf("Elementos de la variable string:\n");
  11.  
  12. for(int a = 0; a <= strlen(string); a++)
  13. {
  14. printf("string[%d] = %c\n", a, string[a]);
  15. }
  16.  
  17. printf("\nElementos de la variable ptr:\n");
  18.  
  19. for(int b = 0; b <= strlen(ptr); b++)
  20. {
  21. printf("ptr[%d] = %c\n", b, ptr[b]);
  22. }
  23.  
  24.  
  25. return 0;
  26. }

ptr es un puntero que apunta a la variable (cadena) string. Al apuntar se reservan 5 celdas de memoria (vamos a llamarlo así) y se pone en ptr el contenido de string. O sea, quedaría una cosa así:

string[0] = “H” (siempre empieza por la celda 0)
string[1] = “o”
string[2] = “l”
string[3] = “a”
string[4] = “\0” (carácter nulo para finalizar la cadena)

y lo mismo con ptr:

ptr[0] = “H”
ptr[1] = “o”
ptr[2] = “l”
ptr[3] = “a”
ptr[4] = “\0”


Entonces esto es aplicable a la función strlen. ptr apunta a cadena. Lo bueno viene ahora. Ponemos por caso que le pasamos, al parámetro de la función, la cadena: elhacker. Luego la cadena cadena quedaría:

cadena[0] = “e”
cadena[1] = “l”
cadena[2] = “h”
cadena[3] = “a”
cadena[4] = “c”
cadena[5] = “k”
cadena[6] = “e”
cadena[7] = “r”
cadena[8] = “\0”


y ptr igual. Con el bucle avanzamos ptr hasta la penúltima celda (ptr[7]) pero cadena sigue en la primera celda (cadena[0]). Entonces se resta, en este caso 8 – 0, y queda el tamaño final.

Sé que lo explico fatal y fantasma306 lo explicó más breve y simple pero mira, así tienes diferentes opciones :).


« Última modificación: 16 Junio 2011, 17:44 pm por Queta » En línea

"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.
Dark Invader

Desconectado Desconectado

Mensajes: 111


Lucha hasta el final para conseguir tu objetivo.


Ver Perfil
Re: ejercicios en c
« Respuesta #12 en: 16 Junio 2011, 18:45 pm »

Gracias a ambos,

Queta ya he estudiado punteros y cadenas,ya te dije que iba por estructuras dinamicas como nodos y pilas  :xD Lo que pasaba es que si por ejemplo:

int strlen(char *cadena)

Esa es la funcion pero por parametro seria:

int strlen(&cadena)

Se enviaria la direccion cadena y el parametro de la funcion almacenaria el valor de esa direccion,en este caso de la cadena.Pero claro estudie que las cadenas y arrays ya estan definidos en memoria,y no haria falta pasar la direccion...O eso creo.

Pero imaginate que no sabes cuanto mide la cadena,imaginemos que has cazado la cadena con gets y a lo mejor son 9 letras(abcdefgh + el caracter de final de cadena)

Entonces¿seria la misma estructura,incrementando y luego decremento?

Y gracias a ti tambien fantasma 306 me quedo muy claro lo que dijistes,y gracias tambien a queta.

Salu2
En línea

Queta

Desconectado Desconectado

Mensajes: 267



Ver Perfil
Re: ejercicios en c
« Respuesta #13 en: 16 Junio 2011, 19:14 pm »

Lo que pasaba es que si por ejemplo:

int strlen(char *cadena)

Esa es la funcion pero por parametro seria:

int strlen(&cadena)

Se enviaria la direccion cadena y el parametro de la funcion almacenaria el valor de esa direccion,en este caso de la cadena.Pero claro estudie que las cadenas y arrays ya estan definidos en memoria,y no haria falta pasar la direccion...O eso creo.

No hace falta; vuélvete a leer este enlace:

http://www.cplusplus.com/doc/tutorial/functions2/

Si continúas sin entenderlo crea otro post y pregunta.

Pero imaginate que no sabes cuanto mide la cadena,imaginemos que has cazado la cadena con gets y a lo mejor son 9 letras(abcdefgh + el caracter de final de cadena)

Entonces¿seria la misma estructura,incrementando y luego decremento?

Fíjate que en mis códigos nunca “sé” el tamaño de las cadenas ::).
En línea

"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.
Dark Invader

Desconectado Desconectado

Mensajes: 111


Lucha hasta el final para conseguir tu objetivo.


Ver Perfil
Re: ejercicios en c
« Respuesta #14 en: 16 Junio 2011, 19:21 pm »

Vale todo claro,gracias a ambos me habeis ayudado mucho  ;D

Salu2
En línea

fantasma306

Desconectado Desconectado

Mensajes: 28



Ver Perfil
Re: ejercicios en c
« Respuesta #15 en: 16 Junio 2011, 21:27 pm »

ksiksi la cadena al final tiene que tener siempre 29 digitos?
En línea

Es mejor callar y que piensen que eres idiota a hablar y demostrarlo.
Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Pantallazos de ejercicios ejercicios 1 y 2 « 1 2 3 »
Ejercicios
soplo 25 98,605 Último mensaje 21 Marzo 2011, 21:15 pm
por hackvj
Ejercicios en C
Ejercicios
soplo 0 65,023 Último mensaje 2 Julio 2004, 00:28 am
por soplo
Ejercicios C++
Ejercicios
soplo 0 91,352 Último mensaje 5 Julio 2004, 06:08 am
por soplo
Ejercicios de ASP
Ejercicios
Cobac 0 18,163 Último mensaje 9 Julio 2004, 07:12 am
por Cobac
Ejercicios PHP
Ejercicios
Azielito 0 45,525 Último mensaje 17 Julio 2004, 10:53 am
por Azielito
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines