Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: NathanD en 28 Febrero 2013, 20:15 pm



Título: Duda sobre funciones que devuelven punteros
Publicado por: NathanD 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.


Título: Re: Duda sobre funciones que devuelven punteros
Publicado por: avesudra 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!


Título: Re: Duda sobre funciones que devuelven punteros
Publicado por: naderST 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.


Título: Re: Duda sobre funciones que devuelven punteros
Publicado por: NathanD en 28 Febrero 2013, 21:08 pm
Muchas gracias a ambos, ahora lo he entendido (y mira que era obvio  :-\ )  ;) ;)


Título: Re: Duda sobre funciones que devuelven punteros
Publicado por: 85 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