|
|
|
|
Bonjour !
Je sais que ce sujet a déjà été abordé dans des messages précédents, mais malgré ça j'arrive toujours à une erreur.
Mon programme est simplement la définition de strcpy :
char my_strcpy(char *s1, const char *s2)
{
s1 = (char *) malloc (sizeof s2);
int i;
for (i=0; s2[i] != '\0'; i++) s1[i] = s2[i]; s1[i]= '\0';
return *s1;
}
Je suis sur que le problème est vraiment trivial mais je débute en C, merci d'avance !
Salut.
|
Répondre à Char Snipeur
|
Salut, tout d'abord s2 est un pointeur sur un const char. Donc sizeof s2 te donne la taille du pointeur ie 4octets et non la taille de ta chaine (si c'est vrai, le compilateur n'est pas normé iso, ce n'est pas le comportement de sizeof sinon il n'y aurait pas de strlen).
char*
my_strcpy (char* dest, const char* src) {
int i;
for (i = 0; src[i]!='\0'; ++i)
dest[i] = src[i];
dest[i] = '\0';
return dest;
}
tafiscobar "lou waye def bopame"
la nullite n'existe pas, l'ignorance oui, ah je suppose!!! |
L'erreur de segmentation était à mon avis plutôt dûe au fait qu'il fallait écrire :
char *dst = (char *) malloc(sizeof(char)*strlen(src)); Si ton my_strcpy retourne le char *, rien ne t'empêche de faire le free dessus à l'extérieur.
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
char*
my_strcpy (char* dest, const char* src) {
int i;
dest = (char *) malloc(sizeof(char)*strlen(src));
for (i = 0; src[i]!='\0'; ++i) dest[i] = src[i];
dest[i] = '\0';
return dest;
}
int main(){
char *src = "tapir",dst;
my_strcpy(dst,src);
printf("dst = %s\n",dst);
free(dst);
getchar(); // pour les windowsiens
return 0;
}
Je n'ai pas testé mais ça doit marcher ça, non ? |
Je ne vois pas pourquoi. En fait de manière générale on essaye juste de mettre le calloc/malloc dans le même horizon que le free (ce qui n'est pas le cas de l'exemple que j'ai donné) et c'est pour ça que la version de tafiscobar est plus propre. Il faut juste avec sa version penser à allouer la chaine dest dans le main (et à la désallouer). |