Programacion C [Regresar puntero en funcion]

Que tal! Antes que nada no sabia donde poner este hilo, pues en EOL no existe un subforo de programacion, por tanto si el hilo molesta no hay ningun problema, pueden borrarlo.

Estoy practicando sobre el tema de los punteros en C, y estoy creando una funcion que acepte dos cadenas como argumentos y me regrese la cadena mas larga de ambas.

Mi codigo es el siguiente: http://pastebin.org/335886

El programa segun yo, esta correctamente, pues modifique mi funcion para que me regresara el numero de caracteres de la cadena mayor, y lo hace sin ningun problema.

El problema es que la funcion no me regresa la cadena mas grande y por ende no se imprime en pantalla.

Por mas que he buscado, no encuentro donde esta mi error.

Si alguien puede ubicarme, se lo agradeceria.

Gracias!
El problema lo tienes en que en la función "funcion" modificas los punteros a la hora de calcular la longitud de las cadenas, por lo que al final devuelves un puntero al char NULL, que es a donde acaban apuntando cadena y cadena2.

Haz la prueba, comenta los bucles en los que compruebas la longitud y verás que se imprime correctamente la segunda cadena.
amuchamu escribió:El problema lo tienes en que en la función "funcion" modificas los punteros a la hora de calcular la longitud de las cadenas, por lo que al final devuelves un puntero al char NULL, que es a donde acaban apuntando cadena y cadena2.

Haz la prueba, comenta los bucles en los que compruebas la longitud y verás que se imprime correctamente la segunda cadena.


Tienes toda la razon man! Fijate que era tambien lo que pensaba, que a la hora de calcular la longitud de las cadenas, la direccion donde se encuentra el NULL es la que se queda al final y es la que apunten *cadena y *cadena2. Por tanto pense que el compilador posicionaba a los punteros al primer elemento nuevamente, pero no es asi, se quedan apuntando a NULL ambos.

La solucion fue declarar otros dos punteros extras ( ptr, p ) dentro de la funcion antes de que comenzaran los bucles, los cuales apuntan hacia ( cadena, cadena2 )

Al final en los return, regreso los punteros *ptr o *p, y sin ningun problema la cadena mayor se imprime correctamente en pantalla.

Pregunta: Como puedo volver a posicionar a los punteros al primer elemento de la cadena y no al final que vendria siendo el valor nulo? O es necesario hacerlo asi como lo resolvi? Con dos punteros extras?
Los punteros sólo guardan direcciones de memoria, no saben más, ni dónde estaban antes ni nada.

Te puedes ahorrar un puntero usando uno auxiliar y devolviendo los originales.

Supongo que usas punteros por practicar, pero para calcular la longitud de una cadena lo normal es usar strlen de string.h, y para recorrer una cadena lo normal es acceder a los caracteres directamente sin modificar el puntero (cadena[aux]). Por ejemplo, podrías calcular la longitud de una cadena así:

int len = 0;
while ( cadena[len] != '\0' ) len++;

Ya que estoy, la función gets está desaconsejada, incluso gcc avisa de que es peligrosa (aunque en este caso da igual). También veo que declaras las cadenas como globales, no tiene mucho sentido para este programa, y usas malloc... te bastaría con tener únicamente en el main "char cadena[100], cadena2[100];".

Bueno no sé si todo esto lo sabías, quizá sí y sólo estabas practicando :P

Saludos
amuchamu escribió:Los punteros sólo guardan direcciones de memoria, no saben más, ni dónde estaban antes ni nada.

Te puedes ahorrar un puntero usando uno auxiliar y devolviendo los originales.

Supongo que usas punteros por practicar, pero para calcular la longitud de una cadena lo normal es usar strlen de string.h, y para recorrer una cadena lo normal es acceder a los caracteres directamente sin modificar el puntero (cadena[aux]). Por ejemplo, podrías calcular la longitud de una cadena así:

int len = 0;
while ( cadena[len] != '\0' ) len++;

Ya que estoy, la función gets está desaconsejada, incluso gcc avisa de que es peligrosa (aunque en este caso da igual). También veo que declaras las cadenas como globales, no tiene mucho sentido para este programa, y usas malloc... te bastaría con tener únicamente en el main "char cadena[100], cadena2[100];".

Bueno no sé si todo esto lo sabías, quizá sí y sólo estabas practicando :P

Saludos


Jajaja es verdad man, pero voy empezando en C y estoy practicamente los punteros y en el libro que sigo Aprendiendo C en 21 dias ( por cierto, un libro muy viejo que ya no venden, pero de los mejores, un best seller xD ) en el capitulo de Cadenas y caracteres, enseñaban la funcion malloc.

Gracias por tu tiempo y atencion, un saludo! =)
4 respuestas