Inserer une Date

Fermé
Enelu Messages postés 26 Date d'inscription mardi 19 avril 2016 Statut Membre Dernière intervention 2 septembre 2016 - 14 mai 2016 à 22:43
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 - 15 mai 2016 à 14:35
Bonjour,
Je programme en C++ et j´aimerais creer un programme qui calcule le nombre de jour entre deux dates. La formule est écrite pas de plroblemes pour ca. Par contre
j´aimerais que l´utilisateur puisse inserer une date de la sorte 14.05.2016 et non :
Veuillez deonnez le jour de la date ... 14
Veuillez donn€ez le mois de la date ... 05
Veuillez donnez l´anné de la date ... 2016
Je ne sais pas si il me faut une bibliotheque speciale ou juste un type de variable que je ne connais pas encore.
Merci davance ^^


1 réponse

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
15 mai 2016 à 14:35
Bonjour,

Il faut parcourir la chaîne pour extraire les champs attendus.
Il y a de nombreuses méthodes :
  • par les expressions régulières
  • en utilisant un 'splitter' qui ici va chercher le séparateur '.'
  • en itérant dans un std::istringstream
  • le sscanf du langage C (c'est mal mais rapide en faisant std::sscanf(str.c_str(),"%u.%u.%u",&jour,&mois,&annee))
  • et j'en oublie surement

Le spliter peut être trouvé, mais il s'écrit rapidement
std::vector<std::string> split( const std::string& str , const std::string& tok ) {
	std::vector<std::string> result;
	for ( int pos = 0 ; ; ) {
		std::size_t pos2 = str.find_first_of( tok.c_str() , pos );
		if ( pos2 == std::string::npos ) {
			result.push_back( str.substr( pos ) ); // empiler le dernier mot
			break;
		}
		result.push_back( str.substr( pos , pos2 - pos ) ); // empiler le mot extrait
		pos = pos2 + tok.length();  // debut du suivant
	}
	return result;
}
On a alors une liste de chaînes qu'il reste à convertir en entier.
On peut faire
std::vector<std::string> vst = split("15.05.2016", ".");
if ( vst.size()==3) {
    int jour  = std::strtol( vst[0].c_str() , 0 , 10 );
    int mois  = std::strtol( vst[1].c_str() , 0 , 10 );
    int annee = std::strtol( vst[2].c_str() , 0 , 10 );
}
0