sábado, 1 de septiembre de 2007

Programa 4. La función "strcat".


En el programa anterior vimos que la función strcpy es desctructiva, pero hay otra función en la librería <string.h> que copia una cadena (fuente) en otra (destino) sin destruir ésta, es decir, que copia una cadena detrás de la otra. Vamos a hacer un ejemplo y luego vamos a implementar esta función por nuestra cuenta para ejercitarnos. Primero el ejemplo:

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

int main(int argc,char **argv)
{
char texto1[]="Mortadelo";
char texto2[]=" y ";
char texto3[]="Filemón";

printf("%s\n",texto1);
strcat(texto1,texto2);
printf("%s\n",texto1);
strcat(texto1,texto3);
printf("%s\n",texto1);
return 0;
}




De ejecución:

antonio@linex-bD2zrN:~/Curso_de_C$ cc -o ejem_strcat ejem_strcat.c
antonio@linex-bD2zrN:~/Curso_de_C$ ./ejem_strcat
Mortadelo
Mortadelo y
Mortadelo y Filemón
Violación de segmento
antonio@linex-bD2zrN:~/Curso_de_C$


Ha salido lo que queríamos.Pero también ha salido algo que no queríamos:"Violación del segmento". La verdad es que no sé muy bien porqué nos sale tal advertencia, pero debe de estar relacionado con el espacio reservado en memoria para las distintas cadenas. En el ejemplo hemos dejado el espacio sin determinar. Si lo modificamos y reservamos espacio suficiente, vemos satisfechos que la advertencia desaparece:

#include
#include

int main(int argc,char **argv)
{
char texto1[50]="Mortadelo";
char texto2[5]=" y ";
char texto3[12]="Filemón";

printf("%s\n",texto1);
strcat(texto1,texto2);
printf("%s\n",texto1);
strcat(texto1,texto3);
printf("%s\n",texto1);
return 0;
}



La ejcución ahora es totalmente limpia:

antonio@linex-bD2zrN:~/Curso_de_C$ cc -o ejem_strcat ejem_strcat.c
antonio@linex-bD2zrN:~/Curso_de_C$ ./ejem_strcat
Mortadelo
Mortadelo y
Mortadelo y Filemón
antonio@linex-bD2zrN:~/Curso_de_C$


Ahora como ejercicio vamos a implementar la función por nuestra cuenta dentro del mismo programa. La llamaremos "mistrcat". El código es el siguiente:

#include<stdio.h>

char mistrcat(char destino[],char fuente[])
{
int i=0;
int j=0;

while(destino[i])i++;

while(fuente[j])
{
destino[i]=fuente[j];
i++;
j++;
}
destino[i]='\0';

return *destino;
}

int main(int argc,char **argv)
{
char texto1[50]="Mortadelo";
char texto2[5]=" y ";
char texto3[12]="Filemón";

printf("%s\n",texto1);
mistrcat(texto1,texto2);
printf("%s\n",texto1);
mistrcat(texto1,texto3);
printf("%s\n",texto1);

return 0;
}


De ejecución:

antonio@linex-bD2zrN:~/Curso_de_C$ cc -o mistrcat mistrcat.c
antonio@linex-bD2zrN:~/Curso_de_C$ ./mistrcat
Mortadelo
Mortadelo y
Mortadelo y Filemón
antonio@linex-bD2zrN:~/Curso_de_C$


Bueno, parece que todo ha ido bien. Hasta pronto.