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);
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
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);
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
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);
++
é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);
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.
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.
loufoque <loufoque@remove.gmail.com> 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.
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.
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.
é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);
é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.
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
Le 10-12-2005, Matt <matt@matta.com> 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
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
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.
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
In news:439b4a13$0$6677$8fcfb975@news.wanadoo.fr, 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.
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.
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.