Strcmp();

Fermé
PR - 2 mai 2013 à 13:25
 PR - 3 mai 2013 à 08:19
Bonjour,

Dans mon programme j'ai besoin de comparer des dates(date + heure), des dates et des heures. Je m'étais rabbatu vers la fonction strcmp étant donné que je stocke ces infos comme des chaines de caractères. Tout fonctionnait bien avec mes tests.

Sauf qu'aujourd'hui je suis tombé sur un cas ou ça ne fonctionne plus :(

par exemple strcmp("02/12/2013","15/08/2013"); me renvoie "-1"
alors que strcmp("02/12/2013","01/12/2013"); me renvoie "+1" .

Ce qui n'est pas normal car au finale on a toujours date1>date2....

Avez vous une solution ?

Cordialement

3 réponses

Bonjour

au finale on a toujours date1>date2
Non, c'est faux. Tu l'as dit toi-même : tes variables sont des chaînes, et strcmp les compare suivant l'ordre alphabétique.
Même si dans ta tête, ces chaînes représentent des dates, C++ n'a aucune raison de le deviner.
Tu peux facilement faire une fonction de comparaison en décomposant tes dates en année, mois et jours séparés pour faire des tests sur chacun.

Mais la meilleure solution serait probablement d'utiliser un type adapté (time_t ou autre, je ne suis pas spécialiste du C++).
0
Bonjour et merci pour ta réponse.

EN effet, c'est alphabétique et donc rien à voir avec des dates ... Mais j'étais persuadé que cela fonctionnait car j'avais fait plein d'essais, mais pas avec les bonnes valeurs à priori...

Je me suis donc réorienté vers un difftime().

Et pour créer un time_t j'ai utilisé un maketime mais il me renvoi toujours -1, donc c'est que ça ne lui plait pas. Mais quand je regarde mon date_t, tous les attributs semblent OK.

(ex : date1.tm_hour=10, etc....) mais le maketime renvoie toujours -1 quelque soit la date.

Je suis dans une impasse
0
Utilisateur anonyme
2 mai 2013 à 16:17
Si ça te retourne -1, c'est que tu ne passes pas les bonnes valeurs.
Peut-on voir le code qui prépare les données et appelle mktime ?
0
struct tm date1, date2;
DATE_string_to_date("15-08-2013 14:58:00","%d-%m-%Y %H:%M:%s",&date1.tm_mon,&date1.tm_mday, &date1.tm_year,&date1.tm_hour,&date1.tm_min,&date1.tm_sec); 

 DATE_string_to_date("16-08-2013 14:58:00","%d-%m-%Y %H:%M:%s",&date2.tm_mon,&date2.tm_mday, &date2.tm_year,&date2.tm_hour,&date2.tm_min,&date2.tm_sec);


Ici la fonction DATE_string_to_date est tirée d'une API. Et le problème ne vient pas de là car avec l'espion, j'observe bien que ma structure est correctement initialisée
difftime(mktime(&date2), mktime(&date1)); 


J'ai vu sur certains forums que des gens enlevaient -1900 à l'année mais je ne vois pas le rapport...

Merci pour ton aide
0
khrogos Messages postés 49 Date d'inscription dimanche 24 mars 2013 Statut Membre Dernière intervention 10 juillet 2013 21
2 mai 2013 à 16:43
ça peut aider : en stockant tes dates dans le format AAAA-MM-JJ tu te retrouve avec des chaines de caractères que tu peux comparer avec strcmp ;-)

"2013-12-02" > "2013-08-15"
"2013-12-02" > "2013-12-01"

https://xkcd.com/1179/
0
Exact ! Merci beaucoup pour cette astuce !
0