Posez votre question Signaler

Langage c: calcul longueur d une chaine [Résolu]

djim - Dernière réponse le 22 oct. 2013 à 23:18
salut!

je dois calculer la longueur d'une chaine de caractere

est ce ke ceci est bon :

#include <stdio.h>
#include <conio.h>

char ptc[6]= "hello";
int i;

void main(void)
{


i = 0;
while(ptc[i] != '\0')
{
i++;
}
return i;

printf("votre chaine de caractere a une longueur de %d caracteres",i);

}


merci pour votre aide!
Lire la suite 
Réponse
+22
moins plus
Salut,
Sinon il y a la fonction "strlen" dispo en incluant "string.h".
Dans ton cas tu auras un truc dans ce genre:
i = strlen(ptc); 

Ton return i me paraît bizarrement placé , non ?

A++
Ajouter un commentaire
Réponse
+3
moins plus
Ta fonction serait inutile, parce que si on la compare le prototype de la fonction strlen avec celle de ta fonction ben...

int strlen(char const *chaine);
int longueur1(char *ptc);

ben comme tu vois c'est la meme chose... alors ca serait inutile...
pourquoi réinventé la roue quand on l'a déja...
Ajouter un commentaire
Réponse
+3
moins plus
il n'y a pas de hasard ici.
si ma chaine vaut 0, ça fait : i=0; i=i+1; i=1-1; donc 0
as tu essayé d'exécuter ce code avant de dire qu'il est faux ?

Le hasard c'est rand(); disponible avec stdlib et l'algorithmique en prévoit le traitement, comme toute autre opération ou fonction mathématique.
Ici le résultat est déterministe puisque i est initialisé à 0.
fiddy 10434Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 1 juillet 2015 Dernière intervention - 24 oct. 2010 à 13:59
Pas besoin d'exécuter un code évidemment faux.
Je m'explique :
Si ta chaîne vaut "\0", alors tu testes le caractères 1 (et non 0) car tu fais de la pré-incrémentation. Le problème c'est que le caractère 1 est après le caractère terminal. Donc tu ne sais pas ce qu'il y a après dans la pile. Failed.
Et c'est pas vraiment mieux pour une chaîne de longueur quelconque.
Par exemple si ta chaîne vaut "ab".
Première itération, tu testes "b" directement (toujours car tu testes ch[++i] au lieu de ch[i++]). "b" est différent de 0 donc on fait une autre itération. i à ce stade vaut 1.
Ensuite, tu testes le caractère suivant soit le '\0' qui vaut évidemment 0. Donc on arrête la boucle. A ce stade, i vaut 2.
Ensuite tu décrémentes i de 1, donc tu renvoies 1. Failed again.
C'est plutôt à toi de tester ton code ;-))).
Je parlais de hasard, pas à cause de ton algorithme mais plutôt par ta façon de faire. Faire deux codes faux de suite, on a l'impression que tu codes avant de réfléchir...
Et pour info, le hasard n'est même pas rand(). Puisque rand() est lié par un algorithme. En informatique, on ne peut pas coder le hasard, juste du pseudo-hasard.
Ici le résultat est déterministe puisque i est initialisé à 0.
Oui, il est déterministe si la chaîne est non nulle (voir plus haut) mais faux.
Répondre
Ajouter un commentaire
Réponse
+1
moins plus
Salut,

avec char on peut declarer un tableu de caractères qui aura un espace mémoire attribué

si un utilise un pointeur de caractère char * avec la commande malloc nous pouvons attribué dynamiquement de la mémoire

dans le cas
car = (char*)malloc(27*sizeof(char));

si sizeof char donne 1 octet alors on aura un un espace alloué de 27 octets
une fois fini le travail avec car on peut liberer la mémoire avec free
dreams07- 26 oct. 2007 à 11:53
Bonjour,
le programme est correct mais il y a probleme c kil ne pt pa calculer les espaces entre les mots
Répondre
Ajouter un commentaire
Réponse
+1
moins plus
Bonjour,

Pour commenter le code proposé par fenomen je ne vois pas l'utilité du malloc.
Le malloc est utilisé pour une allocation dynamique, Or ici c'est clairement du statique : la taille du tableau est connue à l'avance.

Plutôt que de faire
char *car;
car = (char*)malloc(27*sizeof(char)); 


Je serai d'avis de directement faire ceci :

#define BUF_MAX_SIZE 27

void
main()
{
char car[BUF_MAX_SIZE];
/* Mise à 0 */
memset(&car, 0, BUF_MAX_SIZE);

printf("Entrez un mot: \n");
scanf("%s",car);
printf("le nombre de caracteres est : %d",strlen(car));
getch();
}



memset permet de s'assurer que tout le tableau contient des 0, ce qui permet d'être certain que notre chaine de caractère copie grâce à scanf se termine par un '\0'
Après, je pense que scanf() termine la chaine de caractère copiée par un '\0' donc le memset n'est pas obligatoire... a priori.


Maintenant, reproduire strlen n'est pas des plus compliqués, à partir du moment où l'on sait faire des itérations sur un tableau et que l'on sait aussi par quoi se termine une chaine de caractère.


Bon courage,

c-moi
Ajouter un commentaire
Réponse
+1
moins plus
Evidemment tu ne l'a pas testé. Moi si, Il marche (et c'est pas d'aujourd'hui)
Lors de la première itération, c'est le caractère 0 qui est testé.
Le test ne se fait pas sur la valeur incrémentée. L'incrémentation aura lieu après le test. Rappelons qu'en algorithmique, on lit le code de gauche à droite!
L' intérêt de cette manière de faire est la certitude que la boucle aura été exécutée au moins une fois, même si la chaine est vide et que la condition est fausse. On pourra donc prouver le cas échéant que cette boucle a eu lieu, puique i a incrémenté. L'inconvénient, c'est qu'il faut décrémenter i en sortie de boucle.

par contre le code suivant sera plus court, et là, i n'aura pas à être décrémenté.

int longueur(char * ch)
{
int i;
for (i=0; ch[i]; ++i){;}
return i;
}

Ce code fonctionnera à l'identique.
Si la chaine est vide, ici la boucle ne sera même pas effectue une seule fois.
là aussi, l'incrémentation aura lieu après, et seulement si la condition est vraie
donc i ne sera pas incrémenté.

int longueur(char * ch)
{
int i;
for (i=0; ch[++i]; ){;}
return i;
}

et plus besoin de décrémenter i.

'\0' est une convention de formatage pour printf et consorts
(on veut un caractère et on indique son code ascii après l'antislash).
Ici, pas besoin, tu peux le remplacer par 0


;-)
fiddy 10434Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 1 juillet 2015 Dernière intervention - 24 oct. 2010 à 15:30
Je reprends le code que tu as mis dans ton précédent post.

int longueur( char * ch)
{
int i=0;
while(ch[++i]) {;}
return --i;
}

Ce code je le répète ne peut pas marcher. Teste-le vraiment avant de dire ça. D'ailleurs je viens de le tester, et ça renvoie bien la longueur du tableau - 1 (ce qui n'est pas surprenant).

Lorsque tu fais ch[++i], cela incrémente i et renvoie la nouvelle valeur. Autrement dit, lors de la première itération, cela commencera par tester la case 1 et non 0.
Si ton code était ch[i++]; là ça aurait marché.

Le test ne se fait pas sur la valeur incrémentée. L'incrémentation aura lieu après le test. Rappelons qu'en algorithmique, on lit le code de gauche à droite!
J'ai envie de dire, revois ton C. La pré-incrémentation (++i) incrémente i et renvoie la valeur incrémentée. A ne pas confondre avec la post-incrémentation (i++) qui incrémente i et renvoie la valeur précédente. Tu peux chercher sur internet, si t'es pas convaincu.


int longueur(char * ch)
{
int i;
for (i=0; ch[i]; ++i){;}
return i;
}
Ce code fonctionnera à l'identique.

Non, ça ne fonctionne pas à l'identique. Pour que ça fonctionne à l'identique, tu aurais dû mettre dans ton premier code i++ (post incrémentation). Là, c'est différent puisque tu analyses i et t'incrémentes i après.
Par contre, ce code là fonctionne. Là je suis enfin d'accord avec toi.


là aussi, l'incrémentation aura lieu après, et seulement si la condition est vraie
donc i ne sera pas incrémenté.

int longueur(char * ch)
{
int i;
for (i=0; ch[++i]; ){;}
return i;
}

Non l'incrémentation aura lieu avant. Toujours car tu utilises ++i. Il faut utiliser i++ pour faire l'incrémentation après.
Et c'est précisément pour ça que tu n'as pas besoin de décrémenter dans ce cas. Par contre, tu as toujours le problème si la chaîne est vide vu que tu testes le caractère d'après (même refrain : car tu as mis ++i au lieu de i++).
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
déclare comme ça : char ptc[6]= "hello\o";
ça fonctionnera mieux.
Ravachol 565Messages postés vendredi 5 mars 2004Date d'inscription 30 octobre 2005 Dernière intervention - 28 janv. 2005 à 17:23
Salut,
Il me semble que justement l'une des propriétés des constantes chaines en C est que le compilateur place lui même le caractère de code nul en mémoire après le dernier caractère.
Donc char ptc[6] = "hello" ne posera aucun problème.
A moins que je ne fasse fausse route.

A++
Répondre
pacorabanix- 31 oct. 2009 à 01:57
vous êtes tout à fait dans le juste !
Répondre
pacorabanix- 31 oct. 2009 à 01:58
(PS : c'était juste pour mettre une confirmation à ce post, puisque quelqu'un a refait monter le sujet)
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
merci a vous de m'avoir repondu

j'ai une autre question

je dois ecrire une fonction" int longueur1 (char *ptc) ki calcule la longueur de la chaine pointer par ptc.

que donnerai cette " algorithme"

merci pour votre aide
Ajouter un commentaire
Réponse
+0
moins plus
salut, si je peux me permetre
c'est peut être inutile mais ça fonctionne
c'est peut être un cas d'école ?
si ça peut éviter d'utilser string.h ou stdio.h
ça rend l'exécutable plus petit. C'est parfois utile dans les systèmes embarqués. c'est rare, mais ça tue pas le chien.
a+
Ajouter un commentaire
Réponse
+0
moins plus
main()
{char *car;
car = (char*)malloc(27*sizeof(char));
printf("Entrez un mot: \n");
scanf("%s",car);
printf("le nombre de caracteres est : %d",strlen(car));
getch();
}
Uluqiorra- 3 mars 2011 à 21:01
avec le scanf si il fais un espace sa va passe a l'autre instruction donc mieux utiliser la fonction gets
Répondre
fiddy 10434Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 1 juillet 2015 Dernière intervention - 3 mars 2011 à 21:37
Son post date de 6 ans... De plus, on utilise pas gets qui est obsolète mais fgets...
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
Bonjour,
j'ai pas compris le role du fonctions 'malloc' et pourquoi vous avez fait char* et non pas char
merci d'avance
saam38- 14 juin 2013 à 05:25
pour ça il faut que tu te reseignes sur l'allocation dinamique de la mémoie
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
Salut. Pour faire rapide :

(Sans les includes)

void main()
{
//Déclaration de la chaine de 6 caratères (5 pour l'ordi commencant de 0)
char chaine[5] = "hello\0";

//Calcul de la longueur de la chaîne
int i = strlen(chaine);

//Retour à l'utilisateur de i
printf("La chaine \"hello\" contient %ld caracteres\n\n", i);

//Pause de la console (si tu es sous Bugger 3000 [Windows])
system("pause");
return 0;
}
fiddy 10434Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 1 juillet 2015 Dernière intervention - 8 sept. 2008 à 18:25
Salut,
A force de vouloir faire trop vite, on fait des bêtises ;)
Tu as mis, je cite :
char chaine[5] = "hello\0"; 


Donc le \0, ne sera pas stocké dans la chaîne. Aïe.
char chaine[6] est mieux.
Mais plus simple encore :
char chaine[]="hello";

Cdt
Répondre
theven- 30 oct. 2009 à 13:38
int my_strlen(*str)
{
int i;

i = 0;
while (*str != '\0')
{
i = i + 1;
str = str + 1;
}
return (i);
}

voila qui resoud ton probleme.
Répondre
fiddy 10434Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 1 juillet 2015 Dernière intervention - 30 oct. 2009 à 22:21
Ou encore mieux :
size_t slen(const char *str) {
   char *p=str;
   while(*(p++));
   return p-str;
}

Cdlt
Répondre
Scandale- 16 nov. 2009 à 05:04
Je vois qu'on déterre les vieux posts :)

Le but est de ne pas utiliser strlen ! Ma fonction ressemble à ça (testée) :

int strlenclone(const char* chaine)
{
int i = 0;


while (chaine[i] != '\0')
{
i++;
}

return i;
}
Répondre
fiddy 10434Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 1 juillet 2015 Dernière intervention - 16 nov. 2009 à 06:23
Avant de poster, regarde celui qui a déterré ;-))).
Le but est de ne pas utiliser strlen
Bah, je n'ai pas utilisé non plus strlen. Et en plus, ma fonction est plus performante de par l'usage de pointeur.
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
#include <stdio.h>
#include <stdlib.h>

char ptc[6]= "hello";
int i;

void main(void)
{

i=strlen(ptc);


printf("votre chaine de caractere a une longueur de %d caracteres",i);


system("PAUSE");
return 0;
}
tu peux fonctionner votre code avec sa ou avec
#include <stdio.h>
#include <stdlib.h>

char ptc[6]= "hello";
int i;

void main(void)
{

while(ptc[i]!='\0'){

i++;
}
printf("votre chaine de caractere a une longueur de %d caracteres",i);


system("PAUSE");
return 0;
}
Ajouter un commentaire
Réponse
+0
moins plus
#include<stdio.h>
int longueurChaine(char *ch)
{
int i=0;
int l=0;

while(ch[i] != '\0')
{
l++;
i++;
}
return l;
}
yosra- 22 oct. 2010 à 22:47
fonction permet de calculer longueur d'une chaine
Répondre
fiddy 10434Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 1 juillet 2015 Dernière intervention - 23 oct. 2010 à 01:16
Oui ta fonction est bien sauf que ta variable l est inutile.
Autant mettre : return i;
Répondre
blurk- 23 oct. 2010 à 19:22
int longueur( char * ch)
{
int i=0;
while(ch[i++]) {;}
return i;
}
Répondre
fiddy 10434Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 1 juillet 2015 Dernière intervention - 23 oct. 2010 à 22:09
blurk,
Ton programme est faux.
Il faut renvoyer i-1 et non i si tu fais comme ça.
De plus, au lieu de mettre des accolades bien moches après le while, un simple : while(ch[i++]); fera l'affaire.
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
exact pour return i-1;
Les acolades n'ont pas un but d'esthétique mais de compréhension et de lisibilité, et évitent une erreur classique du style
"pourquoi ma boucle n'est exécutée qu'une seule fois, même quand la condition est fausse ?"
ce qui est moche, c'est justement ce type de bug récurent, qui peut être évité avec une programmation structurée, d'où accolades et indentation.
je rectifie :

int longueur( char * ch)
{
int i=0;
while(ch[++i]) {;}
return --i;
}
fiddy 10434Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 1 juillet 2015 Dernière intervention - 24 oct. 2010 à 10:40
Moué, cela fait un code bizarre mais passons.

En tout cas, ton code est toujours faux.
Si tu fais ch[++i], il faut que tu renvoies i.
Mais pis encore, si ta chaîne vaut "\0", ton code aura un comportement bizarre.
L'algorithmique, ce n'est pas du hasard...
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
tous ces codes ont été testés, il marchent. Et même celui-ci
( Certifié C Ansi d'avant 1977 )

Tu as mis -i au lieu de -1 c'est normal que ça ne marche pas.

<
La pré-incrémentation (++i) incrémente i et renvoie la valeur incrémentée. A ne pas confondre avec la post-incrémentation (i++) qui incrémente i et renvoie la valeur précédente. Tu peux chercher sur internet, si t'es pas convaincu.
>

Faux.
++i n'est pas de la pré_incrémentation
++i aura comme différence avec i++ de ne pas déclarer d'instance d'integer pour la valeur à additionner (je parle de la valeur 1).
Le code compilé fera l'économie d'un espace mémoire, et si c'est possible, il utilisera directement un registre du processeur (celui qui contient la valeur en cours de traitement)
résultat dans le code assembleur généré, au lieu de
ADD EAX #adresse_memoire_de_1
on aura à la place INC EAX
ce qui économise au moins un cycle d'horloge.
Le C permet ce genre d'optimisations qui existent en assembleur
tu peux également le tester avec une boucle i++ et une boucle ++i
et un timer en millième de secondes, la différence est flagrante
(de l'ordre de 30% avec ce genre de boucles: avantage ++i)

noter l'heure de départ en millième de secondes
top chrono
boucle
arrêt chrono
noter l'heure de fin en millièmes de secondes

dans la plupart des bons compilateurs, on peut voir le code assembleur généré
avec les options idoines.


voici un dernier exemple avec do while ce qui n'es pas très approprié, mais avec un break (oh! sacrilège!) Ca marche.

int longueur (char *ch)
{
int i=0;
do
{
if(!ch[i]) break;
++i;
}
while(true);

return i;
}

et là effectivement
do
{
if(!ch[++i]) break;
}
while (true);

est une hérésie, car il ne pourra pas faire la différence entre 0 et 1 caractère.
fiddy 10434Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 1 juillet 2015 Dernière intervention - 24 oct. 2010 à 17:18
++i n'est pas de la pré_incrémentation
Bon, quand il y a litige, on cherche des sources.
Par exemple, le MSDN : http://msdn.microsoft.com/en-us/library/6syyw3ba(VS.71).aspx te dit :

The unary operators (++ and --) are called "prefix" increment or decrement operators when the increment or decrement operators appear before the operand. Postfix increment and decrement has higher precedence than prefix increment and decrement. The operand must have integral, floating, or pointer type and must be a modifiable l-value expression (an expression without the const attribute). The result is an l-value.

When the operator appears before its operand, the operand is incremented or decremented and its new value is the result of the expression.

De plus, il te donne un exemple dans le lien qui te montre encore une fois que ++i (ou --i) fait l'incrémentation (ou la décrémentation) et renvoie cette valeur-là. Bon, MSDN me donne raison.

Le standard C99 te donne au paragraphe 6.5.3.1 "Prefix increment and decrement operators" que : "The result is the new value of the operand after incrementation"

Je confirme donc : ++i (incrémentation préfixé ou pré-incrémentation) incrémente i et renvoie la nouvelle valeur.

Je lis même pas la suite ;-)))).
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
ce qui signifie que l'incrémentation sera prioritaire sur d'autres opérandes


exemple

char *ch1="12345";
char *ch2="12345";
++(ch1) ;
printf ("%s\n",ch1 );

2345

++(ch2--) ;
printf ("%s\n",ch2 );

12345

++sera prioritaire sur -- et donc exécuté avant ce dernier
et cela se verra dès qu'on essayera de remplacer ++(ch2--);
par --(ch2++);

qui provoquera un dépassement de pointeur (zone non allouée)
en effet, faire --ch2 provoque un dépassement de pointeur.

Mais pas au point de changer l'ordre des instructions
entre[++i] et ce qui se passe à l'extérieur des crochets.


exemple

if(2*5+1)
et
if(2*(5+1) )

Le changement de priorité n'influera que sur le résultat (11 ou 12), et pas sur le moment où sera effectué le test if,
qui sera effectué de toutes façons après avoir calculé le résultat

Quand c'est l'incrémentation qui est prioritaire, elle permet au compilateur une excellente optimisation
fiddy 10434Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 1 juillet 2015 Dernière intervention - 24 oct. 2010 à 18:09
Pour la priorité des opérations, je n'ai jamais dit le contraire mais ne changeons pas de débat stp.
On parlait de la valeur qui est renvoyée.
La question, je te le rappelle était de savoir si le code suivant (voir ton post 26 était correct ou pas :

int longueur( char * ch)
{
int i=0;
while(ch[++i]) {;}
return --i;
}


Et ce qui semble faire diverger nos opinions et que tu penses que ++i n'est pas une incrémentation. D'ailleurs tu as dit que : "lors de la première itération, c'est le caractère 0 qui est testé.
Le test ne se fait pas sur la valeur incrémentée. L'incrémentation aura lieu après le test"
Mes liens te montrent le contraire : "The result is the new value of the operand after incrementation"
Le résultat (pas de la variable hein) est la nouvelle valeur après incrémentation. Tous les liens que j'ai trouvé sur internet vont dans ce sens.

Trouve-moi un seul lien qui dit que ++i renvoie la valeur avant incrémentation.
Teste pour t'en convaincre :

int i=0;
printf("++i=%d\n",++i);
i=0;
printf("i++=%d\n",i++);

Et vois que la différence entre ++i et i++ n'est pas que de l'économie mémoire mais qu'il y a une différence de valeur renvoyée.
++i te renverra la valeur après incrémentation.
i++ te renverra la valeur avant incrémentation.
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
Voilà ce que j'ai fait:

int longueur( char * ch)
{
int i=0;
while(ch[i++]) {printf("%c\n",ch[i]);}
printf("%c\n",ch[i]);
return --i;
}

avec ch qui contient "1234"
Et là j'ai vu que le premier caractère '1' n'apparait jamais
et la longueur renvoyée est 4

ensuite je remplace
[i++] par [++i]

et là la longueur devient 3 !
(bon je remplace return --i par return i mais là n'est pas le propos)

Ce qui signifie que tu as raison, c'est incrémenté avant d'être testé dans ce cas là, et que donc dans le post de 23 oct 2010 à 19:22 j'aurais du mettre ++i au lieu de i++,
mais que de toutes façons, si ch[0] (ici '1') n'est pas testé, le code ne fonctionne pas.

Merci
;-)
Yahya Chroro- 5 juil. 2012 à 14:54
Voila un petit exemple =>
l'utilisateur entre un mot (chaine de caractères) et le programme affiche combien de caractère dans le mot :)



#include <stdio.h>
#include <stdlib.h>

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

char n[50];
int i;

printf("Entrer un nom\n");
scanf("%s",n);

printf("Le nom %s a %d caravtaires\n",n,strlen(n));



system("PAUSE");
return 0;
}
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
oui c bien mais pour quoi vous avez initialisez la chaine, normalement il faut que tu écris un programme qui demande la saisie d'une chaine et après il vas compter le nombre de caractère de cette chaine.


je pense que sa c'est un bonne programme:


#include<stdio.h>
#include<conio.h>
main(){
int i;
char t[20];
printf(" donnez une chaine:\n");
scanf ("%s",t);
i = 0;
while (t[i] != '\0'){
i = i + 1;
}
printf(" la taille de la chain est %d :", i);
getch();
}
Ajouter un commentaire
Réponse
+0
moins plus
Merci pour le programme, mais à quoi sert la librairie conio.h, je ne vois pas l'utilité ?
fiddy 10434Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 1 juillet 2015 Dernière intervention - 22 oct. 2013 à 23:18
Bonsoir,
Je ne sais pas de quel programme tu parles... Si tu parles du premier, attention il n'est pas correct.
Sinon conio.h n'est pas une librairie mais un header. Et elle ne sert à rien ici.
Répondre
Ajouter un commentaire
Ce document intitulé «  langage c: calcul longueur d une chaine  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.