Tema destacado: Únete al Grupo Steam elhacker.NET
Autor
|
Tema: Funciones y Punteros [C] (Leído 2,173 veces)
|
jackl007
Desconectado
Mensajes: 1.381
[UserRPL]
|
Estoy tratando de crear las funciones que se suelen usar en pseudocodigo cuando se aprende programacion; esto es para poder empezar a familiarizar a unos amigos mios que recien se inician. Por ello he creido conveniente crear la funcion SubCadena, (al menos donde yo aprend pseudo), esta funcion tiene 3 parametros: el primer parametro es una cadena y los dos siguientes son enteros(posicion inicial desde donde cortar la cadena, y el otro la longitud de la nueva cadena). por ejemplo: Cadena cad; cad = SubCadena("mi texto de prueba",4,5) // cad: "texto" Considerenado que: m: poscion 1 i: posicion 2 [espacio] posicion 3 t: posiocion 4 ... Repito: como pseudocodigo Asi que ahora pretendo usar las funciones del C para dar vida a esa famosa funcion de pseudocodigo, para ello he creido conveniente usar punteros, ya que podria devolver mi funcion un arreglo (devol. la direccion de memoria del nuveo arreglo... Tengo entendido que puedo asignar puntero devuelto por mi funcion a un array, para que este array tenga la informacion del nuevo array (cadena recortada).en C: #include <stdio.h> #include <stdlib.h> #include <string.h> char temp[100]; //Variable Global para poder guardar el valor temporal de la funcion. char *SubCadena(char cad[], int desde, int longitud); //declaro la funcion int main(int argc, char *argv[]) { char cadena[100] = "Cadena de Prueba"; char cad2[100]; /* //Pienso que la funcion devuelve un puntero y este se lo asigno a mi array para qe apunte a ese nuevo //arreglo de la direc. de memoria //Pues pretendo guardar la nueva cadena proveniente de la funcion en otra cadena, para volver a seguir //modificando posteriormente (cuando se escribe algoritmos) char *puntero; puntero=SubCadena(cadena,11,6); //Esto no me funciona, porque? cad2=*puntero; printf("%s\n",cad2); */ //Sin embargo, esto si funciona, y funciona bien? printf("%s\n",SubCadena(cadena,11,6)); //Esto funciona, la salida es: "Prueba": posicion de 'P':11, longitud: 6 system("PAUSE"); return 0; } char *SubCadena(char cad[], int desde, int longitud){ // Esto funciona bien, retorna lo que debe retornar: puntero, pero sin embargo no consigo guardarlo en una variable del tipo char, sin utilizar referencias (ya qe se esta mas propenso a error) char *p; p =temp; /*no es necesario colocar &, porque temp es un array, qe lo utilizo para no perder el valor del resultado cuando se termine la funcion y se destruyan las variables locales; por ello es global: temp */ int i, j; for(i=desde-1, j=0;i<desde+longitud-1;i++,j++){ strncpy(&temp[j],&cad[i],1); } temp[longitud]='\0'; return p; } Tambien tengo pensando implementar la funcion Index usada en pseudocidigo, que debe recibir como parametros una cadena, y un caracter, entonces la funcion debe devolver un entero indicando la posicion en donde se encontro el caracter ingresado como parametro... con esas dos funciones se podrian hacer todas las semas funciones.... que se suelen hacer en pseudocodigo... Espero que logren resolver mi duda, pues C aprendi hace unos años atras, mas domino java y vb, y ahora he vuelto a leer sobre punteros. Gracias, Saludos 
|
|
|
|
« Última modificación: 6 Noviembre 2008, 06:36 por jackl007 ツ »
|
En línea
|
|
|
|
|
MazarD
|
Y cual es la pregunta?
Lo que se vé mal así sin probarlo es tener temp como variable global, en la función subcadena() haces que el puntero p apunte a temp i devuelve la dirección de temp al finalizar por lo que en el main el resultado de la función siempre se escribe en temp, así que si haces dos llamadas seguidas a la función sobrescribes la primera y te va a hacer cosas raras, para evitar esto define temp como char* en la función subcadena y le asignas la memoria que creas conveniente con temp=(char*)malloc(tamaño) y haces return temp; Lo de crear la variable p que apunte a temp y después devolver esta referencia no tiene mucho sentido.
Saludos.
|
|
|
|
|
En línea
|
|
|
|
Spider-Net
Desconectado
Mensajes: 1.052
Un gran poder conlleva una gran responsabilidad
|
Pero si define la cadena dentro de la función local subcadena, cuando la función acabe, la cadena será destruida por lo que no le sirve para nada. Lo que yo creo que deberías hacer es crear una cadena en el main. Por ejemplo char temp[200]; en el main, luego pasas a la función la cadena temp por referencia, y la función la haces void y que simplemente modifique lo que quieras en esa cadena. Al ser pasada por referencia no habrá que devolver nada puesto que los cambios que realices también se realizarán en el main.
De todas formas no entiendo como ese código te compila, porque que yo sepa la función para copiar una cadena en otra es strcpy y no strncpy como tienes puesto tú en el for. Así que no entiendo la verdad como eso te ha compilado, a no ser que tú hayas creado esa función...
A lo mejor si aclaras un poco mejor que pretendes hacer y como sea más fácil ayudarte.
Un saludo!
|
|
|
|
|
En línea
|
"Si cuando hablas nadie se molesta, eso es que no has dicho absolutamente nada."
|
|
|
jackl007
Desconectado
Mensajes: 1.381
[UserRPL]
|
Como hago esto: char cadenita[] = SubCadena(cadena,11,6); Osea como le doy el valor de retorno de la funcion a una variable, ya que si lo imprimo directamente en pantalla, todo va bien, pero el problema es al intentar guardar el valor de retorno en una variable tipo char, no tipo char* En otras palabra como le hago para que mi cadenita coja los datos del temp (que esta almacenando temporalmente el valor de retorno del llamado ala funcion). Por eso, estoy declarando la variable global para que no se pierda el valor cuando se hace un llamado a la funcion (ya que si no es global los datos se pierden al momento que finaliza la funcion), ahora quiero recuperar ese dato que la funcion devuelve la referencia hacia el, para seguir haciendo llamadas a la funcion y no tener problemas con los futuras llamadas a la funcion y se pierdan mas datos. tambien lei qe se podria hacer esto: temp=(char*)malloc(tamaño) pero ya no lo coloque, como me estubo funcionando bien, enfocando mi problema a otro lado. strcpy copia toda una cadena a otra strncpy copia de una cadena a otra, indicandole el numero de caracteres que necesitas copiar. Como copio letra por letra hasta recortar lo que necesito, por ello le pongo como tercer atributo 1 PD: asi como esta el codigo compila y se ejecuta correctamente en la pantalla escribiendo: "Prueba" debido a esto: printf("%s\n",SubCadena(cadena,11,6));que lo que hace es imprimir una cadena recortada de: "Cadena de Prueba" desde la posicion 11, con una longitud de 6 caracteres... Gracias por responder
|
|
|
|
|
En línea
|
|
|
|
Spider-Net
Desconectado
Mensajes: 1.052
Un gran poder conlleva una gran responsabilidad
|
Para hacer eso que estás haciendo no necesitas ni siquiera una cadena auxiliar, sería algo así: #include <stdio.h> #include <stdlib.h> #include <string.h> char *SubCadena(char cad[], int desde); int main(int argc, char **argv){ char cadena[100] = "Cadena de Prueba"; char *p=NULL; p=SubCadena(cadena, 11); puts(p); return 0; } char *SubCadena(char cad[], int desde){ char *p=NULL; return p=&cad[desde-1]; } Lo que pasa es que claro, a lo mejor en alguna cadena no quieres coger desde donde le indiques hasta el final, sino coger sólo una longitud por lo tanto si necesitarías una cadena auxiliar que podrías declararla en el main y además no necesitarías ningún puntero si usas una cadena auxiliar, algo así: #include <stdio.h> #include <stdlib.h> #include <string.h> void SubCadena(char cad[], char temp[], int desde, int longitud); int main(int argc, char **argv){ char cadena[100] = "Cadena de Prueba"; char temp[100]; SubCadena(cadena, temp, 11, 6); puts(temp); return 0; } void SubCadena(char cad[], char temp[], int desde, int longitud){ int i, j=0; for(i=desde-1;i<(desde-1)+longitud;i++){ temp[j]=cad[i]; j++; } temp[j]='\0'; } Un saludo!
|
|
|
|
|
En línea
|
"Si cuando hablas nadie se molesta, eso es que no has dicho absolutamente nada."
|
|
|
jackl007
Desconectado
Mensajes: 1.381
[UserRPL]
|
Gracias Spider-Net Pero lo que pretendia hacer es no una funcion void, sino que el resultado lo pueda guardar en una variable del tipo char, por lo que la funcion debe devolverme un valor. PD: el metodo que planteas para recortar la cadena es efectivo, no habia pensando en hacerlo asi; pero como funciona, ya no me preocupo, solo eso de poder guardar el resultado en una variable tipo char. pero de este modo: char CAD CAD = SubCadena("cadena de prueba",11,6) GRACIAS 
|
|
|
|
|
En línea
|
|
|
|
The_Judgement
Desconectado
Mensajes: 119
|
Pero si define la cadena dentro de la función local subcadena, cuando la función acabe, la cadena será destruida por lo que no le sirve para nada. Según lo ha dicho MazarD, al finalizar la función SubCadena no se destruiría temp porque dijo que tiene que reservar memoria con malloc y al reservar memoria de forma dinámica la única forma de liberarla es con free, por lo que sería perfectamente válido devolver la dirección de comienzo de la cadena de caracteres. Luego en el main debería liberar la memoria que reservó cuando ya no la necesite. Saludos.
|
|
|
|
|
En línea
|
Sacred Powers, cast your purifying light upon this corrupt souls, rest in peace sinners!, JUDGEMENT!!!
|
|
|
Spider-Net
Desconectado
Mensajes: 1.052
Un gran poder conlleva una gran responsabilidad
|
Gracias Spider-Net Pero lo que pretendia hacer es no una funcion void, sino que el resultado lo pueda guardar en una variable del tipo char, por lo que la funcion debe devolverme un valor. PD: el metodo que planteas para recortar la cadena es efectivo, no habia pensando en hacerlo asi; pero como funciona, ya no me preocupo, solo eso de poder guardar el resultado en una variable tipo char. pero de este modo: char CAD CAD = SubCadena("cadena de prueba",11,6) GRACIAS  Pero no puedes guardar una cadena en una variable tipo char, eso es imposible, una cadena variable tipo char sólo puede contener un caracter o un número corto de entero. En todo caso lo que guardarías sería la dirección de memoria de principio de la cadena en una variable tipo char * (puntero a char). Pero vamos eso lo podrías implementar en la solución que yo te he puesto de una forma sencilla: #include <stdio.h> #include <stdlib.h> #include <string.h> char *SubCadena(char cad[], char temp[], int desde, int longitud); int main(int argc, char **argv){ char cadena[100] = "Cadena de Prueba"; char temp[100]; char *p=NULL; p=SubCadena(cadena, temp, 11, 6); puts(p); return 0; } char *SubCadena(char cad[], char temp[], int desde, int longitud){ int i, j=0; for(i=desde-1;i<(desde-1)+longitud;i++){ temp[j]=cad[i]; j++; } temp[j]='\0'; return temp; } Pero si define la cadena dentro de la función local subcadena, cuando la función acabe, la cadena será destruida por lo que no le sirve para nada. Según lo ha dicho MazarD, al finalizar la función SubCadena no se destruiría temp porque dijo que tiene que reservar memoria con malloc y al reservar memoria de forma dinámica la única forma de liberarla es con free, por lo que sería perfectamente válido devolver la dirección de comienzo de la cadena de caracteres. Luego en el main debería liberar la memoria que reservó cuando ya no la necesite. Saludos. Tienes razón, no había caído en que al reservar con malloc la zona de memoria no se destruye al finalizar la función ya que sólo puede liberarse con un free. Gracias por la corrección. Un saludo!
|
|
|
|
« Última modificación: 8 Noviembre 2008, 17:03 por Spider-Net »
|
En línea
|
"Si cuando hablas nadie se molesta, eso es que no has dicho absolutamente nada."
|
|
|
|
|
|
|