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

 

 


Tema destacado: Únete al Grupo Steam elhacker.NET


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda sobre funciones que devuelven punteros
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda sobre funciones que devuelven punteros  (Leído 6,154 veces)
NathanD

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Duda sobre funciones que devuelven punteros
« en: 28 Febrero 2013, 20:15 pm »

Hola, hemos empezado con punteros, y me ha surgido una duda, sobre el retorno de funciones.

Supongamos que quiero hacer una función que concatene dos cadenas de caracteres, un strcat "personalizado". La definición de la función la haría así:

Código:
void mi_strcat(char *s_dest, char *s_orig)

Pero veo que la función de string.h está definida de la siguiente forma:

Código:
char *strcat(char*s1, const char *s2)

Entonces, me gustaría saber cuál es la diferencia, ya que no entiendo por qué se especifica como retorno char si no "devuelve" (con la sentencia return) nada. Supongo que será por esclarecer el código, pero no estoy seguro, ya que a efectos prácticos no hay diferencia.

Saludos.


« Última modificación: 28 Febrero 2013, 20:18 pm por NathanD » En línea

avesudra


Desconectado Desconectado

Mensajes: 724


Intentando ser mejor cada día :)


Ver Perfil
Re: Duda sobre funciones que devuelven punteros
« Respuesta #1 en: 28 Febrero 2013, 20:32 pm »

Hola NathanD, supongo que es por hacer más flexible la utilización de la función, dado que strcat devuelve un puntero a la cadena concatenada(al contrario de lo que dices) que es el mismo que tu le especificas en el primer parámetro. Fíjate aquí:

http://www.cplusplus.com/reference/cstring/strcat/

Respondiendo a tu pregunta:

La diferencia es clara, tu función strcat no devolvería nada, y la strcat de la cabecera string un puntero a una cadena, por eso se definió así:
Código
  1. char * strcat ( char * destination, const char * source );

A efectos prácticos si yo quiero hacer esto con tu función no podría pues no devuelve el resultado esperado:
Código
  1. #include <stdio.h>
  2.  
  3. int main(int argc, char * argv [])
  4. {
  5. char cadena1[] = "hola";
  6. char cadena2[] = "adios";
  7. char *cadenaConcatenada = NULL;
  8. cadenaConcatenada = mi_strcat(cadena1,cadena2);
  9. return 0;
  10. }
Pero con la otra sí:
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. int main(int argc, char * argv [])
  5. {
  6. char cadena1[] = "hola";
  7. char cadena2[] = "adios";
  8. char *cadenaConcatenada = NULL;
  9. cadenaConcatenada = strcat(cadena1,cadena2);
  10. return 0;
  11. }

Como dije antes supongo que será por flexibilizar los usos de la función.

¡Un saludo!


« Última modificación: 28 Febrero 2013, 20:40 pm por avesudra » En línea

Regístrate en
naderST


Desconectado Desconectado

Mensajes: 625



Ver Perfil WWW
Re: Duda sobre funciones que devuelven punteros
« Respuesta #2 en: 28 Febrero 2013, 20:59 pm »

Sí como dice Avesudra simplemente es para hacer más práctico el uso de la función. Ejemplo:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. char cadena[200] = "Hola, ";
  5.  
  6. int main() {
  7.    printf("Resultado: %s\n", strcat(cadena, "esto es una prueba."));
  8.    return 0;
  9. }
  10.  

En cambio si no retornara un apuntador al destino, debes hacer lo siguiente:
Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. char cadena[200] = "Hola, ";
  5.  
  6. int main() {
  7.    strcat(cadena, "esto es una prueba");
  8.    printf("Resultado: %s\n", cadena);
  9.    return 0;
  10. }
  11.  

Es más práctico con el retorno.
En línea

NathanD

Desconectado Desconectado

Mensajes: 48


Ver Perfil
Re: Duda sobre funciones que devuelven punteros
« Respuesta #3 en: 28 Febrero 2013, 21:08 pm »

Muchas gracias a ambos, ahora lo he entendido (y mira que era obvio  :-\;) ;)
En línea

85

Desconectado Desconectado

Mensajes: 206



Ver Perfil WWW
Re: Duda sobre funciones que devuelven punteros
« Respuesta #4 en: 2 Marzo 2013, 10:21 am »

si eso que te dijeron y hay algo más que tiene a favor, es lo siguiente y te lo muestro con un ejemplo:

Código
  1. void ReemplazaO(char* str){//Reemplaza la primer ocurrencia de 'O'
  2.  
  3.    if(strstr(str,"O")!=NULL)
  4.    {
  5.        *strstr(str,"O")='0';
  6.        return;
  7.    }
  8. }

Dicha función utiliza la función std llamada STRSTR
http://www.cplusplus.com/reference/cstring/strstr/

Código:
char * strstr (       char * str1, const char * str2 );

que cuando encuentra una cadena dentro de otra, retorna un puntero a la primer ocurrencia en la cadena pasada como 1er parámetro.

Con lo cual tenés un puntero en la posición correcta como para hacer una modificación.

Esto obviamente se puede hacer de otras formas, pero la ventaja de devolver un puntero es en este caso el posicionamiento específico.

No hace falta aclarar que la función "ReemplazaO" retorna al encontrar y cambiar la primer ocurrencia que se encuentre de 'O' ...

Saludos
En línea

Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/
Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Duda sobre funciones inline.
Programación C/C++
OmarHack 7 4,025 Último mensaje 28 Marzo 2013, 17:04 pm
por OmarHack
Duda sobre punteros en C
Programación C/C++
mester 4 2,920 Último mensaje 29 Julio 2015, 22:46 pm
por mester
ayuda con una duda sobre punteros
Programación C/C++
DobleGa 1 1,555 Último mensaje 7 Mayo 2017, 17:18 pm
por CalgaryCorpus
DUDA Punteros a funciones
Programación C/C++
mechanicalgirl 1 1,449 Último mensaje 5 Enero 2018, 03:22 am
por CalgaryCorpus
duda sobre punteros en c++
Programación C/C++
Pedro122h 4 3,598 Último mensaje 3 Marzo 2022, 05:05 am
por Pedro122h
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines