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

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    décembre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2018
    Messages : 3
    Points : 1
    Points
    1

    Par défaut Conversion d’un vecteur de chaines de caractères en vecteur d’entiers

    Bonjour!

    je souhaiterais écrire une fonction qui puisse convertir un tableau de string en un tableau d'entiers.
    Je sais bien que je devrais utiliser stringstream pour ca mais je ne vois malheureusement pas comment m'y prendre ayant du mal a comprendre le principe de stringstream en soi.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vector<int> conversionInt(vector<string> t) {
    je bloque complètement et j'apprécierais quelques indications a ce propos.

    Merci d'avance!

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    3 971
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués

    Informations forums :
    Inscription : juin 2009
    Messages : 3 971
    Points : 11 053
    Points
    11 053
    Billets dans le blog
    1

    Par défaut

    Bonjour,

    Comment convertirais-tu une std::string en int (juste une) ?

    Comment bouclerais-tu sur un vecteur (pour chaque élément, faire...) ?

    Comment ajouterais-tu un élément dans un vecteur ?


  3. #3
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    décembre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2018
    Messages : 3
    Points : 1
    Points
    1

    Par défaut

    Merci pour ces conseils.
    j'ai essayé de faire les 3 séparément comme vous l'avez suggeré puis d'assembler le tout:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    /** Conversion d’un vecteur de cha&#305;nes de caracteres en vecteur d’entiers
     * @param t un vecteur de chaines de caracteres
     * @return le vecteur, converti en vecteur d’entiers
     **/
    vector<int> conversionInt(vector<string> t) {
     
        t= vector<vector<string>> ();
        int num;
        int ligne;
        strinstream sso;
        string str;
     
     
            for(int j=0;i<t[0].size();j++) {
     
                str=t[ligne][j];
                cin>>str;
                sso<<str;
                sso>>num;
     
                sso.clear();
                sso.str("");
     
            }
     
        }
    return t[ligne][j]; 
    //il ma ete demande plus precisement de convertir une colonne c est pour ca que j ai mis t[ligne][j].
     
    }
    n'empeche que j'ai quand meme l'impression que quelque chose ne vas pas...

  4. #4
    Rédacteur/Modérateur

    Homme Profil pro
    Network game programmer
    Inscrit en
    juin 2010
    Messages
    5 518
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : juin 2010
    Messages : 5 518
    Points : 24 037
    Points
    24 037

    Par défaut

    Juste quelque chose qui ne va pas ?
    t= vector<vector<string>> (); qu'est sencé vouloir dire ceci ?!
    return t[ligne][j]; que vaut/signifie ligne ? D'où sort j ?
    Ton code ne passe certainement aucun compileur. Il faudrait faire un minimum d'effort..
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Étudiant
    Inscrit en
    décembre 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : décembre 2018
    Messages : 3
    Points : 1
    Points
    1

    Par défaut

    je voulais déclarer le tableau2D mis je me rends compte que ce qu'il fallait écrire c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vector<vector<string>> t;
    en ce qui concerne t[ligne][j] c'est censé designer une colonne précise du tableau2d, je voulais prendre un indice de colonne fixe puis avec la boucle for dérouler toutes les valeurs de cette colonne grace a un entier j.

    ca resterait sur la meme colonne mais changerait de ligne a chaque incrémentation, .....eeet en expliquant cela je me rends compte que j'ai fait le contraire car dans ce que j'avais fait plus haut l'indice de ligne est fixe et la fonction va dérouler toutes les valeurs d'une ligne donnée et non une colonne.


    edit: Avec du recul je me rends compte que je suis partie du principe que j'avais un tableau2d et que je devais convertir les colonnes, mais il me semble que je n'ai pas besoin d'y avoir recours dans cette fonction vu que je ne dois m'interesser qu'a un seul vecteur.

    donc:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    vector<int> conversionInt(vector<string> t) {
     
        int num;
        stringstream sso;
        string str;
     
     
        for(int j=0;j<t.size();j++) {
     
            str=t[j];
            cin>>str;
            sso<<str;
            sso>>num;
     
            sso.clear();
            sso.str("");
     
        }
     
    }
    return t[j];
     
    }

  6. #6
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    juin 2009
    Messages
    3 971
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués

    Informations forums :
    Inscription : juin 2009
    Messages : 3 971
    Points : 11 053
    Points
    11 053
    Billets dans le blog
    1

    Par défaut

    Il y a en effet beaucoup de choses à dire sur ton code...

    1) L'idée du stringstream est pas mal mais il y a plus simple. En tapant "string to integer C++" dans google, mon premier résultat me donne std::stoi() :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <iostream>
    #include <string> 
     
    int main() {
        std::string str{"42"};
        auto num = std::stoi(str);
        std::cout << num << '\n';
        return num;
    }
    Ce programme affiche et retourne 42.

    2) Dans ton programme, tu remarqueras aussi que certaines variables peuvent-être déclarées à l'intérieur de la boucle. C'est toujours une bonne idée de déclarer les variables au plus proche de leur utilisation, ça rend le code généralement plus simple à comprendre.

    3) Au passage, on est bien d'accord qu'une fonction qui prend en paramètre un vecteur de strings ne devrait absolument pas demander à l'utilisateur de rentrer les strings au clavier hein... Ne t'embête pas avec de la saisie clavier, fais simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int main() {
    	auto v = std::vector<std::string>{"42", "45", "78"};
    	auto n = conversionInt(v);
    }
    Accessoirement, tu n'ajoutes pas tes nombres au vecteur de sortie que tu n'as même pas créé...

    4) Pour faire ta boucle, tu utilises un indice i de type int signé, alors que vector.size() renvoie un type non signé. Si tu as bien activé les warnings de ton compilateur (comme -Wall -Wextra avec GCC), tu devrais avoir un avertissement :
    warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
      for (int j = 0; j < t.size(); j++) {
                      ~~^~~~~~~~~~
    Tu devrais utiliser std::size_t à la place de int.

    Sache qu'il y a mieux à faire, en utilisant une syntaxe particulière de la boucle for :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    vector <string> t = .... ;
     
    for (auto& str : t) {
    	auto num = std::stoi(str);
    	std::cout << num << std::endl;
    }
    5) Enfin, enlève-nous ce using namespace std; qui traîne quelque part dans ton code

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