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);
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.
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.
Antoine Leca wrote:
In news:439dcb14$0$19723$8fcfb975@news.wanadoo.fr, 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.
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.
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.
"Emmanuel Delahaye" <emdel@YOURBRAnoos.fr> wrote in message
news:439ddb01$0$29175$79c14f64@nan-newsreader-05.noos.net...
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 ' '.
"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.
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
In news:439f2347$0$19685$8fcfb975@news.wanadoo.fr, 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