OVH Cloud OVH Cloud

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...

4 réponses

1 2 3
Avatar
loufoque


Et puis même si, parfois, il juste un peu plus qu'un parcours, pourquoi
ne pas faire simplement un parcours ?


Je n'ai jamais dit que c'était mieux que strcpy, mais simplement que
c'était pas exactement comme si l'on faisait deux fois le parcours de la
chaîne.

Avatar
Harpo
Antoine Leca wrote:

In news:439dcb14$0$19723$, Harpo va escriure:
loufoque wrote:

strlen, je ne connais pas mais j'aimerais qu'on me dise somment on
peut l'optimiser...


Une idée (non testée) est de charger un mot et de sortir de la boucle
si l'un quelconque des octets (bytes) est nul.


C'est ce qu'il me semble aussi, mais je me demandais comment faire ce
test simplement.

Pas bien sûr que cela gagne quoi que ce soit sur les processeurs type
P4 actuels (parce que le mot et son entourage immédiat vont se trouver
en entier dans le cache L1 dès le début de l'opération), mais sur des
processeurs un peu moins pointu ou avec des architectures un peu
zarbies cela peut valoir le coup.


Soit, Tu as sans doute raison, je n'y connais rien en hardware, reste le
problème ci-dessus évoqué, je ne suis pas certain qu'il y ait une
solution simple. Je vais neanmoins y réfléchir.


De toute manière, si tu recherches la perf', une des premières des
choses que l'on fait c'est de stocker la longueur des chaînes dans un
coin, et après d'utiliser les primitives qui manipulent des blocs
(mem*()), donc strlen() n'est probablement pas sur le chemin critique.


Ok, c'est ce que je fais, je ne calcule pas 2 fois inutilement une
chose, mais fonctionnelement strlen(x) est la taille de x t j'ai peur
que parfois des gens utilisent strlen à chaque fois su'il veulent avoir
la taille d'une chaîne.


Avatar
Charlie Gordon
"Emmanuel Delahaye" wrote in message
news:439ddb01$0$29175$
C'est pas strdup ca ?


Si, mais strdup() n'est pas standard C. (Mais il fait partie de POSIX,
ce qui le rend très portable).


Je ne vois que des avantages à utiliser strdup(). Elle est largement disponible
puisque spécifiée dans POSIX, et tellement triviale à ajouter pour les rares cas
de portages sur des systèmes dont elle serait absente... Son utilisation évite
les bugs trop nombreux où la taille de la copie est mal calculée, ou le résultat
de malloc n'est pas testé, ou la recopie elle-même est mal faite (mauvaise
longueur, méthode suboptimale etc.

Notons que strdup() ne vérifie en général pas que son argument est non NULL.

GNU définit aussi strndup() qui copie au plus n caractères de la chaine argument
dans une copie allouée par malloc() et terminée par un ''.

vive strdup(), à bas strncpy() !

--
Chqrlie.


Avatar
Antoine Leca
In news:439f2347$0$19685$, Harpo va escriure:

j'ai peur que parfois des gens utilisent strlen à chaque fois
su'il veulent avoir la taille d'une chaîne.


Oui. Et comme cette peur est partagée, et de plus confirmée par la pratique,
c'est bien pourquoi...

Antoine Leca wrote:
De toute manière, si tu recherches la perf', une des premières des
choses que l'on fait c'est de stocker la longueur des chaînes dans un
coin



:-)


Antoine


1 2 3