Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

copie de chaine

24 réponses
Avatar
Matt
Bonjour,

Je vais bientot passer un exam et je suis en train de réviser et je me
pose une question : comment copier une chaine dans une autre ?
par exemple

/* fonction recuperee sur l'excellente faq */
int get_line(char *buf, size_t size)
{
int ret;
if (fgets(buf, size, stdin) != NULL)
{
char *p = strchr(buf, '\n');
if (p != NULL)
{
*p = 0;
ret = 0;
}
else {
ret = 2;
}
}
else
{
ret = 1;
}
return ret;
}

/* fonction qui ne fait rien a part de la copie */
void maFonction(char *pChaine)
{
char pMaChaine[256];
/* comment faire pour le mieux ou une autre solution */
strcpy(pMaChaine, pChaine);
strncpy(pMaChaine, pChaine, strlen(pChaine));
memcpy(pMaChaine, pChaine, strlen(pChaine));
return;
}

int main(int argc, char** argv)
{
char pChaine[256];

printf("Entrez une chaine : ");
get_line(pMaChaine, 255);
maFonction(pMaChaine);

return 0;
}

merci pour vos réponses,

Matt...

10 réponses

1 2 3
Avatar
Emmanuel Delahaye
Je vais bientot passer un exam et je suis en train de réviser et je
me pose une question : comment copier une chaine dans une autre ?
par exemple

/* fonction recuperee sur l'excellente faq */ int get_line(char *buf,
size_t size) { int ret; if (fgets(buf, size, stdin) != NULL) { char
*p = strchr(buf, 'n'); if (p != NULL) { *p = 0; ret = 0; } else {
ret = 2; } } else { ret = 1; } return ret; }

/* fonction qui ne fait rien a part de la copie */ void
maFonction(char *pChaine) { char pMaChaine[256];


Pourquoi p ? C'est un tableau.

char MaChaine[256];

/* comment faire pour le mieux ou une autre solution */
strcpy(pMaChaine, pChaine);


Oui.

strncpy(pMaChaine, pChaine, strlen(pChaine));


Moui... mais je ne recommande pas cette fonction, surout utilisée comme
ça...

memcpy(pMaChaine, pChaine, strlen(pChaine));


Non. Manque un bout...

memcpy(pMaChaine, pChaine, strlen(pChaine) + 1);

Mais comme strcpy() fait ça, autant utilise strcpy(). Si la longueur
était donnée séparément ou calculée ou mesurée une fois avant pour un
autre usage, memcpy() aurait été plus efficace.

Une copie dans une variable locale n'est pas bien utile. Même pas sûr
que le code soit compilé, vu qu'il nefait rien de visible...

return;


Inutile.

}

int main(int argc, char** argv) { char pChaine[256];


Pourquoi p ?

char Chaine[256];

printf("Entrez une chaine : "); get_line(pMaChaine, 255);


get_line(MaChaine, sizeof MaChaine);

maFonction(pMaChaine);

return 0; }


--
A+

Emmanuel Delahaye

Avatar
Blue_Bear
étant assistant de TP la bonne solution que je te conseille est:


la chaîne d'origine définie on suppose comme:
char origine[LONGUEUR_CHAINE];


la copie se fait :

char *destination = NULL;
destination = malloc(strlen(origine)+1);
if (destination ) /* cad destination != NULL */
strcpy(destination, origine);
else
printf("Impossible d'allouer un espace mémoire pour copier la chaine");


et qd tu n'as plus besoin de la chaîne bien penser à faire un:
free(destination);


++
Avatar
loufoque

strncpy(pMaChaine, pChaine, strlen(pChaine));


Moui... mais je ne recommande pas cette fonction, surout utilisée comme
ça...


Quel est d'ailleurs l'intérêt de cette fonction par rapport à memcpy ?


Avatar
Emmanuel Delahaye

strncpy(pMaChaine, pChaine, strlen(pChaine));



Moui... mais je ne recommande pas cette fonction, surout utilisée comme
ça...


Quel est d'ailleurs l'intérêt de cette fonction par rapport à memcpy ?


Si il y a la place, elle complète la suite de 0...

--
A+

Emmanuel Delahaye



Avatar
loufoque

Si il y a la place, elle complète la suite de 0...


Ce qui n'a pas vraiment d'intérêt, puisqu'un seul 0 suffit.

Avatar
Harpo
loufoque wrote:


strncpy(pMaChaine, pChaine, strlen(pChaine));


Moui... mais je ne recommande pas cette fonction, surout utilisée
comme ça...


Quel est d'ailleurs l'intérêt de cette fonction par rapport à memcpy ?


Elle coûte plus chère.



Avatar
Etienne de Tocqueville
loufoque a écrit sur fr.comp.lang.c :


strncpy(pMaChaine, pChaine, strlen(pChaine));
Moui... mais je ne recommande pas cette fonction, surout utilisée comme

ça...


Quel est d'ailleurs l'intérêt de cette fonction par rapport à memcpy ?


En mettant comme longueur un strlen() de la chaine source, aucun intérêt.

Mais en général, la longueur indiquée n'est pas la longueur de la chaine
source, mais la taille du tableau destination.

Dans ce cas, strcnpy a l'avantage sur memcpy de ne pas lire dans la
chaine source au delà de la fin de chaine, même si la longueur à copier
n'est pas atteinte. La fonction mempcy continuera à lire au delà de la
fin de la chaine source, au risque de provoquer un SEGV, car rien ne dit
que les octets qui suivent sont accessibles en lecture.



Avatar
Astar0th
étant assistant de TP la bonne solution que je te conseille est:


la chaîne d'origine définie on suppose comme:
char origine[LONGUEUR_CHAINE];


la copie se fait :

char *destination = NULL;
destination = malloc(strlen(origine)+1);
if (destination ) /* cad destination != NULL */
strcpy(destination, origine);
else
printf("Impossible d'allouer un espace mémoire pour copier la chaine");


et qd tu n'as plus besoin de la chaîne bien penser à faire un:
free(destination);




C'est pas strdup ca ?

Asta.

Avatar
Marc Boyer
Le 10-12-2005, Matt a écrit :
Bonjour,

Je vais bientot passer un exam et je suis en train de réviser et je me
pose une question : comment copier une chaine dans une autre ?
par exemple


Ca dépend du contexte.

/* fonction qui ne fait rien a part de la copie */
void maFonction(char *pChaine)
{
char pMaChaine[256];


1) ne pas utiliser de constante littérale
#define STRING_MAX_SIZE 256
2) qu'est ce qui, dans l'énoncé, permet de savoir que
la chaine fera 256 char au plus ?

/* comment faire pour le mieux ou une autre solution */
strcpy(pMaChaine, pChaine);


La solution classique.

strncpy(pMaChaine, pChaine, strlen(pChaine));


Aucun intérêt. Montre que tu n'as pas compris le rôle
du 3ème argument de strncpy (mais tu n'es pas le seul).

memcpy(pMaChaine, pChaine, strlen(pChaine));


Deux parcours de la chaine quand un seul suffit.

Marc Boyer
--
Entre le fort et le faible, c'est la liberte qui opprime et le droit
qui libere. Henri Lacordaire, Dominicain

Avatar
Antoine Leca
In news:439b4a13$0$6677$, Matt va escriure:
/* fonction qui ne fait rien a part de la copie */


Autrement dit, un compilateur un peu fin va supprimer entièrement la
fonction... Mauvais pari avec les compilateurs d'aujourd'hui.


void maFonction(char *pChaine)
{
char pMaChaine[256];


Non initialisé... autrement dit rempli de valeurs aléatoires.


strncpy(pMaChaine, pChaine, strlen(pChaine));


DANGEREUX (au fou !)

Révise bien ce que fait cette fonction (et strlen()), et essaye de
comprendre ce que fait en réalité cette ligne.
Si tu comprends cela (et pas seulement le +1), tu n'auras pas perdu ton
temps de révision.


memcpy(pMaChaine, pChaine, strlen(pChaine));


Idem.


Antoine

1 2 3