Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
709 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  Problème de lecture chaine caractère

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème de lecture chaine caractère

n°261282
Elbarto
Posté le 05-12-2002 à 01:19:42  profilanswer
 

Salut,
 
j'ai un exercice en C qui me donne des soucis car il y a une variable chaine qui ne s'affiche pas comme prévu,
 
l'exercice consiste à entrer sous format américain une date ( par exemple 2002/12/04 )
 
puis le programme convertit alors la date sous format français en texte:
"nous sommes le 4 décembre 2002"
 
le problème c'est que l'année n'est pas affichée, je vous montre le code, tout à l'air correct mais à la fin la variable "Annee" ne contient pas de valeur alors qu'au début elle avait bien la valeur extraite depuis le tableau "Date":
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. void main()
  5. {
  6. system("CLS" );
  7. int i;
  8. char Date[10], M, Mois_chaine[9] ;
  9. char Mois[2], Annee[4], Jour[2];
  10. printf("Entrez la date au format americain AAAA/MM/JJ:" );
  11. scanf(" %s",Date);
  12. for (i=0; i<4;i++)
  13. {
  14.  Annee[i]=Date[i];
  15. }
  16. Annee[4]='\0';  //ici en faisant un printf sur la variable Annee le prog affiche bien l'année
  17. for (i=5; i<7;i++)
  18. {
  19.  Mois[i-5]=Date[i];
  20. }
  21.  Mois[2]='\0'; //à ce niveau si on inclu dans ce code la commande pour afficher la variable Annee on se rend compte que la variable est vide ce qui est incompréhensible
  22. for (i=8; i<10; i++)
  23. {
  24.  Jour[i-8]=Date[i];
  25. }
  26.  Jour[2]='\0';
  27. M=((Mois[0]-48)*10+(Mois[1]-48))+64;
  28. switch (M)
  29. {
  30.  case 'A': strcpy(Mois_chaine,"Janvier" ); break;
  31.  case 'B': strcpy(Mois_chaine,"Fevrier" ); break;
  32.  case 'C': strcpy(Mois_chaine,"Mars" ); break;
  33.  case 'D' : strcpy(Mois_chaine,"Avril" ); break;
  34.  case 'E' : strcpy(Mois_chaine,"Mai" ); break;
  35.  case 'F' : strcpy(Mois_chaine,"Juin" ); break;
  36.  case 'G' : strcpy(Mois_chaine,"Juillet" ); break;
  37.  case 'H': strcpy(Mois_chaine,"Aout" ); break;
  38.  case 'I' : strcpy(Mois_chaine,"Septembre" ); break;
  39.  case 'J' : strcpy(Mois_chaine,"Octobre" ); break;
  40.  case 'K' : strcpy(Mois_chaine,"Novembre" ); break;
  41.  case 'L' : strcpy(Mois_chaine,"Decembre" ); break;
  42. }
  43. printf("nous sommes le %s %s %s",Jour,Mois_chaine,Annee); //là le prog affiche le jour, le mois mais pas l'année  
  44. system("Pause" );
  45. }


 
aidez moi à trouver ce qui cloche dans ce programme SVP
 
Merci


Message édité par Elbarto le 05-12-2002 à 16:24:21
mood
Publicité
Posté le 05-12-2002 à 01:19:42  profilanswer
 

n°261284
Kristoph
Posté le 05-12-2002 à 01:41:01  profilanswer
 

Rappel :
 
char annee[4] reserve un tableau de 4 caractères. Donc avec le '\0' terminal, cela te laisse 3 caractères au choix ;)

n°261334
Elbarto
Posté le 05-12-2002 à 02:36:11  profilanswer
 

Salut,
 
même en dimensionnant le tableau Annee à 5 ça foire toujours :(


Message édité par Elbarto le 05-12-2002 à 02:45:09
n°261370
Elbarto
Posté le 05-12-2002 à 03:01:28  profilanswer
 

il me semble qu'un tableau en C inclu l'indice zéro
 
donc quand je tape Annee[4] ça signifie l'ensemble des indices allant de 0 à 4, donc bien 5 caractères:
 
Annee[0]
Annee[1]
Annee[2]
Annee[3]
Annee[4]
 
aidez moi je ne vois toujours pas où est l'erreur dans le code source

n°261372
HappyHarry
Posté le 05-12-2002 à 03:05:39  profilanswer
 

deja avec strtok ca serait plus propre je trouve

n°261417
Kristoph
Posté le 05-12-2002 à 09:39:43  profilanswer
 

Elbarto a écrit a écrit :

il me semble qu'un tableau en C inclu l'indice zéro
 
donc quand je tape Annee[4] ça signifie l'ensemble des indices allant de 0 à 4, donc bien 5 caractères:
 
Annee[0]
Annee[1]
Annee[2]
Annee[3]
Annee[4]
 
aidez moi je ne vois toujours pas où est l'erreur dans le code source




 
Ah la la, ne pas vouloir reconnaitres ses erreurs ;)
 
Et quand tu fais int tableau[4]; il inclue aussi un zero terminal le C ?

n°261418
antp
Super Administrateur
Champion des excuses bidons
Posté le 05-12-2002 à 09:41:39  profilanswer
 

Elbarto a écrit a écrit :

il me semble qu'un tableau en C inclu l'indice zéro
 
donc quand je tape Annee[4] ça signifie l'ensemble des indices allant de 0 à 4, donc bien 5 caractères:
 
Annee[0]
Annee[1]
Annee[2]
Annee[3]
Annee[4]
 




 
non, 0 à taille-1


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°261875
Acidman
no comment
Posté le 05-12-2002 à 16:09:51  profilanswer
 

en C un tableau commence toujours a l'indice 0
donc tab[4] est un tableau a 5entrée
 
Moi je te conseil de faire des memset pour initialiser tes tableau au depart.Deja ca evitera des merdes.
apres debug bien ton prog ton erreur est forcément quelque part

n°261878
Acidman
no comment
Posté le 05-12-2002 à 16:11:35  profilanswer
 

ton printf de ton tableau tu le fait avant année[4]='/0' ou aprés?

n°261880
antp
Super Administrateur
Champion des excuses bidons
Posté le 05-12-2002 à 16:13:33  profilanswer
 

acidman a écrit a écrit :

en C un tableau commence toujours a l'indice 0
donc tab[4] est un tableau a 5entrée
 




 
On parle bien du même langage ?
 
Dans ma version du C et du C++ tab[4] = 4 éléments, 0 à 3


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
mood
Publicité
Posté le 05-12-2002 à 16:13:33  profilanswer
 

n°261892
Elbarto
Posté le 05-12-2002 à 16:23:38  profilanswer
 

acidman a écrit a écrit :

ton printf de ton tableau tu le fait avant année[4]='/0' ou aprés?




 
je suis débutant en C, le printf je le fais sur la variable Année,
 
ainsi:
 
printf("Année:%s",Annee);
 
si on tape cette commande tout de suite après cette partie:
 
 

Code :
  1. for (i=0; i<4;i++)
  2. {
  3. Annee[i]=Date[i];
  4. }


 
ben ça marche, mais si je retape plus tard la ligne "printf("Année:%s",Annee);" ben là ça marchera plus, notamment en fin de programme lorsque je tape la commande:
 

Code :
  1. printf("nous sommes le %s %s %s",Jour,Mois_chaine,Annee);


 
 

antp a écrit a écrit :

On parle bien du même langage ?
Dans ma version du C et du C++ tab[4] = 4 éléments, 0 à 3




 
 
 
il me semble bien qu'un tableau en C commence toujours par l'indice zéro,
 
mais après je ne sais plus si le chiffre indiqué à la déclaration du tableau correspond à la dernier valeur de l'indice ou bien au total des indices incluant le zéro ?  
 
le langage utilisé est bien un C classique standard qui marche avec tout bon compilateur C ( Dev C++, le vieux turbo Borland C++, n'importe quel compilateur )
 
j'attends vos réponses ;)


Message édité par Elbarto le 05-12-2002 à 16:30:48
n°261912
darklord
You're welcome
Posté le 05-12-2002 à 16:38:28  profilanswer
 

antp a écrit a écrit :

 
 
On parle bien du même langage ?
 
Dans ma version du C et du C++ tab[4] = 4 éléments, 0 à 3




 
c'est ca


---------------
Just because you feel good does not make you right
n°261915
_fred
Posté le 05-12-2002 à 16:41:54  profilanswer
 

quand tu fais ta declaration :  
 

Code :
  1. char annee[4]

 tu declares un tableau de quatre caracteres :  
annee[0] (1er caractère)  
annee[1] (2eme)  
annee[2](3eme)  
annee[3] (4eme)
 
ensuite  
 Mois[2]='\0'; //à ce niveau si on inclu dans ce code la commande pour afficher la variable Annee on se rend compte que la variable est vide ce qui est incompréhensible
 
pas forcemement. par un effet de bord il se peut que Mois[2] soit Annee[0] ( les variables sont declarées cotes a cotes donc il se peut qu'il en soit de mm pour l'allocation memoire - me semble-t-il) : donc annee serait ainsi :"'\0'XXX" donc il n'y a rien a afficher ( je m'avance peut-etre).
 
 
enfin voila  
 :)

n°261919
zion
Plop
Posté le 05-12-2002 à 16:44:03  profilanswer
 

antp a écrit a écrit :

 
 
On parle bien du même langage ?
 
Dans ma version du C et du C++ tab[4] = 4 éléments, 0 à 3




 
Franchement les modos ca raconte n'importe quoi  :whistle:  
 


---------------
Informaticien.be - Lancez des défis à vos amis
n°261921
drasche
Posté le 05-12-2002 à 16:44:29  profilanswer
 

antp a écrit a écrit :

 
 
On parle bien du même langage ?
 
Dans ma version du C et du C++ tab[4] = 4 éléments, 0 à 3




je confirme aussi, c'est bien ça.

n°261922
HappyHarry
Posté le 05-12-2002 à 16:44:39  profilanswer
 

Zion a écrit a écrit :

 
 
Franchement les modos ca raconte n'importe quoi  :whistle:  
 
 




 
[:rofl]

n°261924
antp
Super Administrateur
Champion des excuses bidons
Posté le 05-12-2002 à 16:45:13  profilanswer
 

Zion a écrit a écrit :

 
 
Franchement les modos ca raconte n'importe quoi  :whistle:  
 
 




 
 :pfff:


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
n°261926
Elbarto
Posté le 05-12-2002 à 16:47:00  profilanswer
 

Ok un grand merci les gars, grace à vous tous j'ai trouvé pourquoi ça foirait :) ;)
 
en effet tout venait de ma confusion sur la taille d'un tableau en C, en fait quand on déclare un tableau du style tab[n] moi je pensais qu'il y avait des indices allant de 0 à n alors qu'en réalité les indices vont de 0 à n-1 ;)
 
voici donc le listing corrigé qui marche grace à vous:
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. void main()
  5. {
  6. system("CLS" );
  7. int i, j;
  8. char Date[11], M, Mois_chaine[10] ;
  9. char Mois[3], Annee[5],  Jour[3];
  10. printf("Entrez la date au format americain AAAA/MM/JJ: " );
  11. scanf(" %s",Date);
  12. for (i=0; i<4;i++)
  13. {
  14.  Annee[i]=Date[i];
  15. }
  16. Annee[4]='\0';
  17.  
  18. for (i=5; i<7;i++)
  19. {
  20.         Mois[i-5]=Date[i];
  21.            }
  22.  Mois[2]='\0';
  23. for (i=8; i<10; i++)
  24. {
  25.  Jour[i-8]=Date[i];
  26. }
  27.  Jour[2]='\0';
  28.                      
  29. M=((Mois[0]-48)*10+(Mois[1]-48))+64;
  30.                    
  31. switch (M)
  32. {
  33.  case 'A': strcpy(Mois_chaine,"Janvier" ); break;
  34.  case 'B': strcpy(Mois_chaine,"Fevrier" ); break;
  35.  case 'C': strcpy(Mois_chaine,"Mars" ); break;
  36.  case 'D' : strcpy(Mois_chaine,"Avril" ); break;
  37.  case 'E' : strcpy(Mois_chaine,"Mai" ); break;
  38.  case 'F' : strcpy(Mois_chaine,"Juin" ); break;
  39.  case 'G' : strcpy(Mois_chaine,"Juillet" ); break;
  40.  case 'H': strcpy(Mois_chaine,"Aout" ); break;
  41.  case 'I' : strcpy(Mois_chaine,"Septembre" ); break;
  42.  case 'J' : strcpy(Mois_chaine,"Octobre" ); break;
  43.  case 'K' : strcpy(Mois_chaine,"Novembre" ); break;
  44.  case 'L' : strcpy(Mois_chaine,"Decembre" ); break;
  45. }
  46. printf("\n\nnous sommes le %s %s %s\n\n",Jour,Mois_chaine,Annee);
  47. system("Pause" );
  48. }


 
bon c'est pas très propre comme code, un peu lourd et il y a surement des possibilités pour simplifier mais bon je suis débutant en C

n°261928
kadreg
profil: Utilisateur
Posté le 05-12-2002 à 16:48:34  profilanswer
 


 
16:39 on m'a demander de debugger un prog C qui marche pas, pour faire
      simple j'ai remplacé tous les malloc( x) par des mallox( x * 100 )
      ... et bien maintenant ça marche ... aller Zou ! au suivant !


---------------
brisez les rêves des gens, il en restera toujours quelque chose...  -- laissez moi troller sur discu !
n°261936
zion
Plop
Posté le 05-12-2002 à 16:54:32  profilanswer
 

drasche a écrit a écrit :

 
je confirme aussi, c'est bien ça.




 
t'es vraiment sur?  
 
parce qu'antp, c un programmeur pascal, il comprends rien au c++  :sarcastic:


---------------
Informaticien.be - Lancez des défis à vos amis
n°261941
drasche
Posté le 05-12-2002 à 16:55:17  profilanswer
 

Zion a écrit a écrit :

 
 
t'es vraiment sur?  
 
parce qu'antp, c un programmeur pascal, il comprends rien au c++  :sarcastic:  




vilain trolleur  :sarcastic:
au fait toi aussi tu programmes un pascal :p


Message édité par drasche le 05-12-2002 à 16:55:44
n°261948
zion
Plop
Posté le 05-12-2002 à 16:58:04  profilanswer
 

drasche a écrit a écrit :

 
au fait toi aussi tu programmes un pascal :p




 
Oui, mais je n'affirme pas des erreurs sous couvert de mon
mandat de modo moi  [:banzai]


---------------
Informaticien.be - Lancez des défis à vos amis
n°261970
HappyHarry
Posté le 05-12-2002 à 17:04:52  profilanswer
 

Elbarto a écrit a écrit :

 
bon c'est pas très propre comme code, un peu lourd et il y a surement des possibilités pour simplifier mais bon je suis débutant en C  




 
genre comme ca
 

Code :
  1. annee = strtok(date,"/" );
  2. mois = strtok(NULL,"/" );
  3. jour = strtok(NULL,"/" );
  4. i = atoi(mois); // char *  --> int

 
 
en prenant garde au fait que strtok est destructeur ... la chaine  passée est fichue, il faut donc en faire une copie si on souhaite la conserver

n°262014
darklord
You're welcome
Posté le 05-12-2002 à 17:17:27  profilanswer
 

Zion a écrit a écrit :

 
 
Franchement les modos ca raconte n'importe quoi  :whistle:  
 
 




 
 [:xp1700]


---------------
Just because you feel good does not make you right
n°262690
Musaran
Cerveaulté
Posté le 06-12-2002 à 03:38:56  profilanswer
 

Encore un qui multiplie ses chances de réponses: http://www.developpez.net/forums/viewtopic.php?t=45517
 
Mais quel besoin de copier dans tout les sens ?

Code :
  1. #include <stdio.h>
  2. int main(void){
  3. int Jour, noMois, An;
  4. const char* NomsMois[12]= {
  5.  "Janvier",
  6.  "Février",
  7.  "Mars",
  8.  "Avril",
  9.  "Mai",
  10.  "Juin",
  11.  "Juillet"  ,
  12.  "Août",
  13.  "Septembre",
  14.  "Octobre",
  15.  "Novembre",
  16.  "Décembre"
  17. };
  18. printf("Entrez une date au format américain AAAA/MM/JJ: " );
  19. scanf("%d/%d/%d", &An, &noMois, &Jour);
  20. printf("Au format français: le %d %s %d\n" , Jour, NomsMois[noMois-1], An);
  21. return 0;
  22. }


Il me semble que le format de date américain est MM/DD/YYYY.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
n°262759
drasche
Posté le 06-12-2002 à 10:27:06  profilanswer
 

Musaran a écrit :


Il me semble que le format de date américain est MM/DD/YYYY.


C'est bien exact.

n°262762
Acidman
no comment
Posté le 06-12-2002 à 10:27:54  profilanswer
 

tres bien si tu as corriger ton probleme mais ceci dit je te conseil de prendre l'habitude d'initialiser tout tes tableau avec memset et fait le systématiquement car bien souvent cela evite beaucoup de probleme.

n°263958
Musaran
Cerveaulté
Posté le 07-12-2002 à 02:06:21  profilanswer
 

Pour que ça ne fasse pas d'erreur si on se sert de son contenu sans y avoir mis quelque chose ?
Ça reste discutable.
 
Pour moi il est erroné d'initialiser "par prudence" une variable. Ça empêche justement le compilateur de signaler les oublis.
Ou alors utiliser une valeur boguée exprès.
 
Et puis bon, memset, une taille, une occasion de se gourer...
Pour initialiser un tableau à 0, utiliser ={};.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  Problème de lecture chaine caractère

 

Sujets relatifs
probleme avec LWP::UserAgent;Probleme de dimension et de ligne sur un TD
Deux declarations de tableaux de caracteres = probleme[SQL]probleme avec une requete
Probleme en PHP svp![POO] problème de design
[XHTML] problème entre navigateurs malgré W3C (screens inside)[MFC] Problème d'include
[ JAVA ] probleme avec un servlet dans tomcatprobleme avec redirection automatique vers une url
Plus de sujets relatifs à : Problème de lecture chaine caractère


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR