Problème de lecture chaine caractère

Problème de lecture chaine caractère - C++ - Programmation

Marsh Posté le 05-12-2002 à 01:19:42    

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
Reply

Marsh Posté le 05-12-2002 à 01:19:42   

Reply

Marsh Posté le 05-12-2002 à 01:41:01    

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

Reply

Marsh Posté le 05-12-2002 à 02:36:11    

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


Message édité par Elbarto le 05-12-2002 à 02:45:09
Reply

Marsh Posté le 05-12-2002 à 03:01:28    

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

Reply

Marsh Posté le 05-12-2002 à 03:05:39    

deja avec strtok ca serait plus propre je trouve

Reply

Marsh Posté le 05-12-2002 à 09:39:43    

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 ?

Reply

Marsh Posté le 05-12-2002 à 09:41:39    

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
Reply

Marsh Posté le 05-12-2002 à 16:09:51    

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

Reply

Marsh Posté le 05-12-2002 à 16:11:35    

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

Reply

Marsh Posté le 05-12-2002 à 16:13:33    

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
Reply

Marsh Posté le 05-12-2002 à 16:13:33   

Reply

Marsh Posté le 05-12-2002 à 16:23:38    

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
Reply

Marsh Posté le 05-12-2002 à 16:38:28    

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
Reply

Marsh Posté le 05-12-2002 à 16:41:54    

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

Reply

Marsh Posté le 05-12-2002 à 16:44:03    

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
Reply

Marsh Posté le 05-12-2002 à 16:44:29    

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.

Reply

Marsh Posté le 05-12-2002 à 16:44:39    

Zion a écrit a écrit :

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




 
[:rofl]

Reply

Marsh Posté le 05-12-2002 à 16:45:13    

Zion a écrit a écrit :

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




 
 :pfff:


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 05-12-2002 à 16:47:00    

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

Reply

Marsh Posté le 05-12-2002 à 16:48:34    


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

Marsh Posté le 05-12-2002 à 16:54:32    

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
Reply

Marsh Posté le 05-12-2002 à 16:55:17    

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
Reply

Marsh Posté le 05-12-2002 à 16:58:04    

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
Reply

Marsh Posté le 05-12-2002 à 17:04:52    

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

Reply

Marsh Posté le 05-12-2002 à 17:17:27    

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
Reply

Marsh Posté le 06-12-2002 à 03:38:56    

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
Reply

Marsh Posté le 06-12-2002 à 10:27:06    

Musaran a écrit :


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


C'est bien exact.

Reply

Marsh Posté le 06-12-2002 à 10:27:54    

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.

Reply

Marsh Posté le 07-12-2002 à 02:06:21    

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
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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