PROBLEME AVEC STRUCTURE

PROBLEME AVEC STRUCTURE - C - Programmation

Marsh Posté le 03-02-2008 à 18:28:38    

salut ,
 
 
Voila j'ai une probleme avec une strucure.
 

Code :
  1. #include <stdio.h>
  2. #include <conio.h>
  3. struct Personne
  4. {
  5.        char Nom[50];
  6.        char Prenom [50];
  7.        int Age;
  8.        }LaPersonne;
  9. main ()     
  10.      
  11. {
  12. LaPersonne.Age=19;
  13. {
  14. printf("%e",LaPersonne.Age);
  15. }
  16. getch();
  17. }


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

Reply

Marsh Posté le 03-02-2008 à 18:28:38   

Reply

Marsh Posté le 03-02-2008 à 18:36:24    

Les capitales dans le titre du topic.
 
%e, c'est même pas dans ma doc. Essaie %d
 
Maintenant ça y est ... printf


Message édité par Profil supprimé le 03-02-2008 à 18:42:04
Reply

Marsh Posté le 03-02-2008 à 18:44:53    

merci l'ami, effectivement avec"%d" ça fonctionne!!

Reply

Marsh Posté le 03-02-2008 à 18:48:00    

clintou a écrit :

merci l'ami, effectivement avec"%d" ça fonctionne!!


 
De rien, les capitales  [:baobab]


Message édité par Profil supprimé le 03-02-2008 à 18:48:45
Reply

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;

Reply

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.


Message édité par Joel F le 03-02-2008 à 18:54:33
Reply

Marsh Posté le 03-02-2008 à 18:57:06    

clintou a écrit :

encore moi j'ai un autre probleme.
 
en initialisant le champ prenom avec une chaine de caractère le compilateur bug.
 
LaPersonne.Prenom=bouba;


 
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  :??:

Reply

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

Reply

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.

Reply

Marsh Posté le 03-02-2008 à 19:29:37    


 
 :heink: c'ets la base du C la gestion de la mémoire

Reply

Marsh Posté le 03-02-2008 à 19:29:37   

Reply

Marsh 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!!

Reply

Marsh Posté le 03-02-2008 à 19:36:49    

Joel F a écrit :


 
 :heink: c'ets la base du C la gestion de la mémoire


 
T'es sûr que c'est pas son problème.
 
Je plaisante, souplesse tout ça...


Message édité par Profil supprimé le 03-02-2008 à 19:37:01
Reply

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.

Reply

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 :
  1. #include <stdlib.h> /* pour le retour de main */
  2. #include <string.h> /* pour strncpy */
  3. #include <stdio.h> / pour printf je suppose */
  4. struct Personne
  5. {
  6.  
  7.  char Nom[50];
  8.  char Prenom [50];
  9.  int Age;
  10.  
  11. } LaPersonne;
  12.  
  13. int main (void)    
  14.    
  15. {
  16.  char pause;
  17.  char * nom = "bouddha";
  18.  LaPersonne.Age=19;
  19.  strncpy(LaPersonne.Prenom, nom, strlen(nom));
  20.  
  21.  printf("%d",LaPersonne.Age);
  22.       
  23.  pause=getchar();
  24.  return 0;
  25. }


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

Message cité 1 fois
Message édité par Profil supprimé le 03-02-2008 à 20:02:00
Reply

Marsh Posté le 03-02-2008 à 20:05:56    

Euh, merci Joel F
[:dawa]

Reply

Marsh Posté le 03-02-2008 à 20:11:16    

desole mais je n'ai pas compris cette instruction.
 
 
strncpy(LaPersonne.Prenom, nom, strlen(nom));

Reply

Marsh Posté le 03-02-2008 à 20:19:12    

clintou a écrit :

desole mais je n'ai pas compris cette instruction.
 
 
strncpy(LaPersonne.Prenom, nom, strlen(nom));


 
De la doc ici strcpy et strncpy sur developpez.com.
et puis il y à google, un moteur de recherche [:powa]

Reply

Marsh Posté le 03-02-2008 à 20:20:22    

clintou, merci d'éditer le titre du topic pour en enlever les majuscules

Reply

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.

Reply

Marsh Posté le 04-02-2008 à 16:07:25    


Une façon compliquée d'écrire :

Code :
  1. strcpy (LaPersonne.Prenom, nom);



---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 04-02-2008 à 16:13:46    

Emmanuel Delahaye a écrit :


Une façon compliquée d'écrire :

Code :
  1. strcpy (LaPersonne.Prenom, nom);




 
Alors là, Joel F à préconisé strncpy, moi je met strncp. Et j'ai lu de que strcpy était vulnérable.
 
Voila voila  :??:

Reply

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


Message édité par Elmoricq le 04-02-2008 à 17:13:31
Reply

Marsh Posté le 04-02-2008 à 17:26:40    

Reçu, merci Elmoricq

Reply

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 ?
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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.
 
 
 
 
 

Reply

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 :[

Reply

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() [:arcueid brunestud]
 
Parce qu'avec strncpy(), on est obligé de gérer le \0 terminal si la source est plus grande que la destination. :/

Reply

Marsh Posté le 04-02-2008 à 20:42:34    

:jap: je l'oublie tout le temps celui là [:dawa]

Reply

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.

Message cité 1 fois
Message édité par Profil supprimé le 05-02-2008 à 17:52:00
Reply

Marsh Posté le 05-02-2008 à 17:51:26    

Pour ma part, j'utilise ceci :
snprintf(dest, taille_de_dest, "%s", source);

Reply

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 ?


Message édité par Profil supprimé le 05-02-2008 à 18:06:54
Reply

Marsh Posté le 05-02-2008 à 18:43:28    


Code :
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main (void)
  4. {
  5.    char dest[8];
  6.    *dest = 0;
  7.    strncat (dest, "Hello world", sizeof dest - 1);
  8.    printf ("dest = '%s' (%u car)\n", dest, (unsigned) strlen (dest));
  9.    return 0;
  10. }



dest = 'Hello w' (7 car)
 
Press ENTER to continue.


Message édité par Emmanuel Delahaye le 05-02-2008 à 18:45:51

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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.

Reply

Marsh Posté le 05-02-2008 à 19:07:21    


  • Un pointeur et un tableau sont des objets différents.
  • Quand on passe un tableau 'tab' de taille N à une fonction, celui-ci est convertit en l'adresse du nième élément de ce tableau, soit tab + n avec n valant de 0 à N-1.


Définit "assimiler".

 


Message cité 1 fois
Message édité par Emmanuel Delahaye le 05-02-2008 à 19:11:47

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 05-02-2008 à 19:12:47    

Emmanuel Delahaye a écrit :


Définit "assimiler".
 
 


 
Présenter comme semblable.

Reply

Marsh 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

 


Message édité par Emmanuel Delahaye le 05-02-2008 à 19:19:30

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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é

Message cité 1 fois
Message édité par Profil supprimé le 05-02-2008 à 20:27:20
Reply

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


Message édité par Emmanuel Delahaye le 07-02-2008 à 19:04:51

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 07-02-2008 à 20:38:32    

Merci  :jap:

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed