PROBLEME AVEC STRUCTURE - C - Programmation
Marsh Posté le 03-02-2008 à 18:44:53
ReplyMarsh Posté le 03-02-2008 à 18:48:00
clintou a écrit : merci l'ami, effectivement avec"%d" ça fonctionne!! |
De rien, les capitales
Marsh Posté le 03-02-2008 à 18:53:10
encore moi j'ai un autre probleme.
en initialisant le champ prenom avec une chaine de caractère le compilateur bug.
LaPersonne.Prenom=bouba;
Marsh Posté le 03-02-2008 à 18:54:02
une chaine de caractére :
1/ ca se met entre guillement
2/ on alloue la mémoire necessaire
3/ on utilse strncpy
Et %e ca existe, c'ets pour afficher des nombres réels en notations scientifiques.
Marsh Posté le 03-02-2008 à 18:57:06
clintou a écrit : encore moi j'ai un autre probleme. |
J'en sais rien, avec Ada, il faut donner une chapine de longueur égale à celle de la variable affecté.
Donc peut-être, soit en complétant la chaine avec 50-5=45 caractère ' ' (espace) ou en restreignant l'espace d'affectation à 5 caractères, ça passera
Marsh Posté le 03-02-2008 à 18:59:36
desole je n'ai pas compris.
1/ ca se met entre guillement
2/ on alloue la mémoire necessaire
3/ on utilse strncpy
Marsh Posté le 03-02-2008 à 19:11:35
Entre guillemet ... comme ça... "bouddha"
alouer la mémoire, ça doit être un truc comme la fonction 'malloc', mais là, c'est un truc de pro pour moi, et moi je sèche pour le moment.
Et strncpy, ça doit être une fonction qui permet de copier une chaîne de caractères. En cherchant un peut sur google, tu devrais trouver ton bonheur.
je vais faire ce que tu fais, avec les info de Joel F pour voir.
Marsh Posté le 03-02-2008 à 19:29:37
ReplyMarsh Posté le 03-02-2008 à 19:34:42
"c'ets la base du C la gestion de la mémoire"
parle plus clairement l'etranger,exprime toi!!
Marsh Posté le 03-02-2008 à 19:36:49
Joel F a écrit : |
T'es sûr que c'est pas son problème.
Je plaisante, souplesse tout ça...
Marsh Posté le 03-02-2008 à 19:54:03
en fait j'ai defini une structure et j'ai declaré une variable de type structure.Je souhaite affecter une valeur au champ prenom de ma structure ma je n'ai sais pas comment faire.
Marsh Posté le 03-02-2008 à 19:59:50
Voila ce que j'ai fais. (désolé pour l'orthographe, je ne suis pas très fort en rien façon, bref)
Code :
|
J'ai remplacé getch par getchar parce que j'ai trouvé des truc qui m'ont influencé dans ce sens.
Normalement strncpy prend des pointeur sur caractère et non des tableau de char.
Et comme je l'ai dis, je ne connais pas malloc.
Marsh Posté le 03-02-2008 à 20:11:16
desole mais je n'ai pas compris cette instruction.
strncpy(LaPersonne.Prenom, nom, strlen(nom));
Marsh Posté le 03-02-2008 à 20:19:12
clintou a écrit : desole mais je n'ai pas compris cette instruction. |
De la doc ici strcpy et strncpy sur developpez.com.
et puis il y à google, un moteur de recherche
Marsh Posté le 03-02-2008 à 20:20:22
clintou, merci d'éditer le titre du topic pour en enlever les majuscules
Marsh Posté le 03-02-2008 à 21:02:29
En haut de chaque message, tu as 5 ou 5 icônes. L'une d'entre elles te permet d'éditer le message, y compris le premier qui contien le titre qui dans ce topic est en CAPITALES.
Marsh Posté le 04-02-2008 à 16:07:25
Une façon compliquée d'écrire :
Code :
|
Marsh Posté le 04-02-2008 à 16:13:46
Emmanuel Delahaye a écrit :
|
Alors là, Joel F à préconisé strncpy, moi je met strncp. Et j'ai lu de que strcpy était vulnérable.
Voila voila
Marsh Posté le 04-02-2008 à 16:43:56
Pas plus vulnérable qu'en indiquant à strncpy() la taille du buffer de lecture, alors que c'est celui dans lequel on écrit qui devrait servir de référence, pour ne pas faire de dépassement de capacité : si "nom" est plus grand que "LaPersonne.Prenom", ça dépasse, et çaÿ mal ©
Du coup, l'utilisation que tu en fais est strictement identique à strcpy() tout court.
Mais ce n'est pas tout : strncpy avec la bonne taille de buffer est très casse-gueule aussi, cf. la manpage à ce sujet (vraiment une implémentation de daube sur ce coup-là, d'ailleurs).
Perso je préfère utiliser snprintf().
Marsh Posté le 04-02-2008 à 17:57:52
Bah oui, mais comme toujours, il faut réfléchir avant d'agir. Vulnérable, certes, mais comment, pourquoi ? Et ta 'correction', tu penses qu'elle est moins vulnérable ? Comment ? Pourquoi ?
Marsh Posté le 04-02-2008 à 18:30:05
Emmanuel Delahaye a écrit : Bah oui, mais comme toujours, il faut réfléchir avant d'agir. Vulnérable, certes, mais comment, pourquoi ? Et ta 'correction', tu penses qu'elle est moins vulnérable ? Comment ? Pourquoi ? |
Perso, je pense avec Ada, qu'est loin d'être du C et je n'y connais pas grand chose, et encore moins au C.
La vulnérabilité, je l'ai pioché sur google, je n'y ai pensé qu'une seconde en me disant que des individus plus compétents que moi c'étaient penché sur la question, et j'ai exploité l'info qui corroborait l'orientation de Joel F.
Marsh Posté le 04-02-2008 à 18:38:04
ouais non mais bon ^^ ici strncpy c'etait surtout pr copier genre t'es 49+1 caractéres vu que tu utilise un tableau statique au lieu de faire de smalloc/free et d'encapsuler ça proprement :[
Marsh Posté le 04-02-2008 à 20:18:17
Joel F a écrit : ouais non mais bon ^^ ici strncpy c'etait surtout pr copier genre t'es 49+1 caractéres vu que tu utilise un tableau statique au lieu de faire de smalloc/free et d'encapsuler ça proprement :[ |
snprintf()
Parce qu'avec strncpy(), on est obligé de gérer le \0 terminal si la source est plus grande que la destination.
Marsh Posté le 05-02-2008 à 17:49:06
Yep,
Serait-il possible d'avoir les implémentations respectives des intervenants si leur disponibilité leur permet, au moins une, pour faire ce qui est à faire ici.
C'est pas pour pomper et avoir une bonne note, c'est pour voir si c'est possible de faire les choses correctement en fait.
On souhaite simplement affecter une chaîne de caractères constante à une variable de type tableau de caractères.
Marsh Posté le 05-02-2008 à 17:51:26
Pour ma part, j'utilise ceci :
snprintf(dest, taille_de_dest, "%s", source);
Marsh Posté le 05-02-2008 à 18:04:57
Yep,
Elmoricq, une petite question, (j'écris habituellement avec Ada)
Je peux alors confondre tableau de caractères et pointeur sur char ?
Marsh Posté le 05-02-2008 à 18:43:28
Code :
|
|
Marsh Posté le 05-02-2008 à 19:02:02
Merci Emmanuel Delahaye,
Cependant, j'ai la même question à poser...
Peut-on, dans un sens, assimiler un tableau de char à un pointeur sur char ?
La réponse m'intéresse grandement.
Marsh Posté le 05-02-2008 à 19:07:21
Définit "assimiler".
Marsh Posté le 05-02-2008 à 19:12:47
ReplyMarsh Posté le 05-02-2008 à 19:18:34
C'est tordu. Si tu veux dire 'pareil', ben non, c'est pas pareil.
Un pointeur est une variable simple modifiable. Un tableau est une variable composée non modifiable dont les éléments sont modifiables. Bref, rien à voir. C'est le fait que *(p + i) soit équivalent à p[i] qui te trouble ? Simple 'sucre syntaxique' selon l'expression consacrée.
http://mapage.noos.fr/emdel/notes.htm#pointeurs
http://mapage.noos.fr/emdel/notes.htm#tableau
Marsh Posté le 05-02-2008 à 19:31:48
Merci,
Si je comprends bien, lorsque l'on passe un tableau la ou est attendu un pointeur, à la génération d'une cible, la chaîne de production (pardon pour le flou) opère un décalage de Tab[n] à Tab[0] ? j'ai bon ?
edit : ou plutôt de tab[n] à tab, excusé
Marsh Posté le 07-02-2008 à 19:04:27
Ce qui donne :
Citation : Si je comprends bien, lorsque l'on passe un tableau la ou est attendu un pointeur, le compilateur convertit automatiquement tab en l'adresse du premier élément, c'est à dire &tab[0], qui s'écrit aussi tab + 0, soit, en définitive, tab |
C'est pour ça qu'on met 'tab' et non '&tab'.
Marsh Posté le 03-02-2008 à 18:28:38
salut ,
Voila j'ai une probleme avec une strucure.
Apres avoir compilé et executer il m'affiche une variable incomprehensible du style:4.406791e-309 alors qu'il aurait du m'afficher 19,non?
merci d'avance à tous ceux qui m'aideront!!