ejercicios en c

Iniciado por ksiksi, 15 Junio 2011, 19:12 PM

0 Miembros y 4 Visitantes están viendo este tema.

fantasma306

Código (cpp) [Seleccionar]
int strlen(char *cadena)
{
char *ptr = cadena;

while(*ptr++);
*ptr--;

return ptr - cadena;
}


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
Es mejor callar y que piensen que eres idiota a hablar y demostrarlo.

Queta

#11
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:

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):

#include <stdio.h>
#include <string.h>

int main()
{
char string[] = "Hola";

char *ptr = string;

printf("Elementos de la variable string:\n");

for(int a = 0; a <= strlen(string); a++)
{
printf("string[%d] = %c\n", a, string[a]);
}

printf("\nElementos de la variable ptr:\n");

for(int b = 0; b <= strlen(ptr); b++)
{
printf("ptr[%d] = %c\n", b, ptr[b]);
}

getchar();

return 0;
}


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 :).
"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.

Dark Invader

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

Queta

Cita de: Dark Invader en 16 Junio 2011, 18:45 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.

Cita de: Dark Invader en 16 Junio 2011, 18:45 PM
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 ::).
"Intenta no volverte un hombre de éxito, sino volverte un hombre de valor." Albert Einstein.

Dark Invader

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

Salu2

fantasma306

ksiksi la cadena al final tiene que tener siempre 29 digitos?
Es mejor callar y que piensen que eres idiota a hablar y demostrarlo.