fonction atoi, 00:00 en entrée

fonction atoi, 00:00 en entrée - C - Programmation

Marsh Posté le 14-09-2009 à 14:27:15    

Bonjour,
On avait un exercice dans un examen en fin d'année, l'année dernière et je voulais à tout prix le résoudre, en fait il fallait entrer deux heures dans le format 00:00, l'une l'heure de départ d'un vol, et l'autre son heure d'arrivée, sachant que l'avion peut décoller tard la nuit avant minuit et arriver le matin ... bref j'ai fait un petit essai :
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. int duree(char *depart,char *arrivee)
  4. {
  5. int duree,mdep,marr;
  6. mdep = atoi(&depart[0])*60; // heures * 60
  7. mdep += atoi(&depart[3]); // + minutes
  8. marr = atoi(&arrivee[0])*60; // heures * 60
  9. marr += atoi(&arrivee[3]); // + minutes
  10. duree = marr - mdep;  //différence
  11. return duree;
  12. }
  13. int main()
  14. {
  15. char depart[5],arrivee[5];
  16. int mduree;
  17. printf("Entrez l'heure de départ : \n" );
  18. scanf("%s",depart);
  19. printf("Entrez l'heure d'arrivée : \n" );
  20. scanf("%s",arrivee);
  21. mduree = duree(depart,arrivee);
  22. printf("Durée : %dh %dm \n",(mduree/60),mduree-((mduree/60)*60));
  23. return 0;
  24. }


 
le problème c'est que la fonction atoi ne marche pas dans la première fois où elle est appelée, &depart[0] comme argument, or ça marche bien dans les autres appels !
 
Merci d'avance pour vos éclaircissements !

Reply

Marsh Posté le 14-09-2009 à 14:27:15   

Reply

Marsh Posté le 14-09-2009 à 14:30:31    

n'utilise pas atoi, utilise strtol, voire sscanf dans ton cas.
 
Et ton utilisation de scanf est tout à fait foireuse, vu que sizeof "00:00" == 6 et non 5. Utilise fgets.

Reply

Marsh Posté le 14-09-2009 à 15:10:01    

pourquoi sizeof(00:00) == 6 ? c'est tout des caractères, vous voulez dire qu'il y'a un buffer overflow ? atoi dans les autres cas marchent aussi bien !
sinon je vais voir du côté de strtol et sscanf, merci.

Reply

Marsh Posté le 14-09-2009 à 15:30:09    

Parce que les chaines de caractères se terminent par \0 en C.

Citation :

La fonction atoi() convertit le début de la chaîne pointée par nptr en entier de type int. Le résultat est identique à un appel
 
    strtol(nptr, (char **)NULL, 10);  
 
à la différence que atoi() ne détecte pas d'erreur.


---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 14-09-2009 à 16:21:45    

En C, les chaines de caractères ont un caratère nul (zéro binaire) à la fin. Il ne faut jamais oublier de reserver de la place pour ce caractère supplémentaire.
 
Tout ce qui est entre guillemets, ex. "abc", est une chaine de caractères. Par contre entre apostrophes, il n' y a qu'un caractère unique, ex 'a', sans caractère nul au bout.

Reply

Marsh Posté le 14-09-2009 à 18:18:48    

NULL ! comment j'ai pu l'oublier, merci tout le monde !

Reply

Sujets relatifs:

Leave a Replay

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