IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Problème pour rechercher/convertir string vers int


Sujet :

C++

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    178
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 178
    Points : 252
    Points
    252
    Par défaut Problème pour rechercher/convertir string vers int
    Bonjour,

    J'aimerai réaliser une fonction qui vérifie une date saisie en string, pour cela je récupère les données avec substr et les transforme en int avec atoi().
    Voici ma fonction modifiée pour vérifier les données:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    cout<<"Date de fin (ex: 01/01/2009) : ";
    getline(cin,dateFin); // Récupère la date saisie
     
    bool dateValide(string dateFin)
    {
    	char *j,*m,*a;
    	j = (char*)dateFin.substr(0,2).c_str();
    	m = (char*)dateFin.substr(3,2).c_str();
    	a = (char*)dateFin.substr(6,4).c_str();
     
            cout<<atoi(j)<<" "<<atoi(m)<<" "<<atoi(a)<<endl;
    }
    Pour l'instant je récupère le mois et l'année (m,a) mais la valeur de jour est la même que m.
    Cela semble concerner uniquement les premiers caractères de dateFin, car si je mets substr(6,4) pour j, j'obtiens l'annee.
    J'ai essayé en assignant directement "01/02/2009" à dateFin sans passer par la saisie et j'ai la même erreur...

    Qu'en pensez-vous? d'où peut venir le problème?

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Bonjour,
    Examinons la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    j = (char*)dateFin.substr(0,2).c_str();
    Elle se décompose en :
    1/ Appel de substr -> construction d'un std::string temporaire , appelons sub1, résultat de la fonction
    2/ Appel de c_str sur sub1
    3/ destruction de la std::string temporaire sub1.
    -> le pointeur c_str ne désigne plus quelque chose de valide !
    En gardant ton principe, ce doit être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    std::string str_jour(dateFin.substr(0,2));
    const char *j = str_jour.c_str();
    //...
    Quelques remarques sur ton code :
    1/ Ne fais pas de cast sauvage ( j = (char*)...), mais utilises le type approprié : const char *j;
    2/ Le C++ t'offre des moyens de faire des conversions avec des solutions C++ : cf FAQ.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    178
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 178
    Points : 252
    Points
    252
    Par défaut
    Merci pour ta réponse
    En effet ça fonctionne mieux sans les cast sauvages ^^
    Mais j'ai finalement utilisé istringstream comme tu me l'a conseillé et ça fonctionne bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int j,m,a;
    string dateFin;
     
    getline(cin,dateFin); // Récupère la date saisie	'jj mm aaaa'		
    istringstream iss(dateFin); // Créé un flux à partir de la chaine à convertir
    iss>>j>>m>>a; // Récupère le jour, le mois et l'année en int
    J'espère l'avoir bien utilisé, en tout cas ça fonctionne, je mets en résolu.
    Merci encore

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par umeboshi Voir le message
    Merci pour ta réponse
    En effet ça fonctionne mieux sans les cast sauvages ^^
    Mais j'ai finalement utilisé istringstream comme tu me l'a conseillé et ça fonctionne bien.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int j,m,a;
    string dateFin;
     
    getline(cin,dateFin); // Récupère la date saisie	'jj mm aaaa'		
    istringstream iss(dateFin); // Créé un flux à partir de la chaine à convertir
    iss>>j>>m>>a; // Récupère le jour, le mois et l'année en int
    J'espère l'avoir bien utilisé, en tout cas ça fonctionne, je mets en résolu.
    Merci encore
    Tu reste tributaire d'un format de chaîne assez fixe. Tu peux regarder soit du côté des expressions régulières soit du côté de Boost.Date_Time pour une approche moins maison

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Soucis pour convertir string en int avec readline
    Par Angelssen dans le forum Windows Forms
    Réponses: 4
    Dernier message: 22/01/2010, 12h58
  2. Problème pour passer un String en int
    Par Bouboukick dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 29/05/2008, 17h07
  3. Réponses: 25
    Dernier message: 07/07/2007, 21h36
  4. conversion string vers int
    Par mathher dans le forum C++
    Réponses: 4
    Dernier message: 14/04/2006, 17h52
  5. [C#] Fonction pour convertir string[] vers ArrayList
    Par luimême dans le forum Windows Forms
    Réponses: 6
    Dernier message: 07/04/2005, 13h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo