Duda sobre funciones que devuelven punteros

Iniciado por NathanD, 28 Febrero 2013, 20:15 PM

0 Miembros y 1 Visitante están viendo este tema.

NathanD

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

void mi_strcat(char *s_dest, char *s_orig)

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

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.

avesudra

#1
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í:
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:

#include <stdio.h>

int main(int argc, char * argv [])
{
char cadena1[] = "hola";
char cadena2[] = "adios";
char *cadenaConcatenada = NULL;
cadenaConcatenada = mi_strcat(cadena1,cadena2);
return 0;
}

Pero con la otra sí:

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

int main(int argc, char * argv [])
{
char cadena1[] = "hola";
char cadena2[] = "adios";
char *cadenaConcatenada = NULL;
cadenaConcatenada = strcat(cadena1,cadena2);
return 0;
}


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

¡Un saludo!
Regístrate en

naderST

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


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

char cadena[200] = "Hola, ";

int main() {
    printf("Resultado: %s\n", strcat(cadena, "esto es una prueba."));
    return 0;
}


En cambio si no retornara un apuntador al destino, debes hacer lo siguiente:

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

char cadena[200] = "Hola, ";

int main() {
    strcat(cadena, "esto es una prueba");
    printf("Resultado: %s\n", cadena);
    return 0;
}


Es más práctico con el retorno.

NathanD

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

85

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 (cpp) [Seleccionar]

void ReemplazaO(char* str){//Reemplaza la primer ocurrencia de 'O'

   if(strstr(str,"O")!=NULL)
   {
       *strstr(str,"O")='0';
       return;
   }
}


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

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
Me cerraron el Windows Live Spaces, entonces me creé un WordPress XD
http://etkboyscout.wordpress.com/