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 :

prb ragant: string to int[]


Sujet :

C++

  1. #1
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut prb ragant: string to int[]
    bonjour, je me fais un petit programme et j'ai eu besoin de transformer un
    std::string avec plusieur valeur int en un tableau d'int
    le programme se compile, s'executer, et plante a un endroit ou ca n'a pa de sense.
    si quelqu'un a une idéé j'ecoute
    voici le code
    merci



    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    #include <cstdlib>
    #include <iostream>
    #include <sstream>
    #include <stdlib.h>
    #include <string>
    #include <fstream>
    #include <math.h>
     
    //#include <pr/linked_list.h>
     
    using namespace std;
    int main()
    { string df="23,34,2,5";
      string tm;
      int ln, x, x2, lc=0, c=0, d=0, dd=0;
      ln=df.length();
      for(x=0;x!=ln;x++)
                        {if (df.find(",",x)==x)  //si a la possision x y'a une ","
                        lc++;
                        };
     
    int *tab=new int[lc];  //tableau pour les valeur recuperer
    cout<<"ca passe 1\n";
     
    for(x=0;x!=ln;x++)
                      {
                       cout<<"ca passe 2\n";
                       if (df.find(",",x)==x)  //si a la possition x il y'a ","
                           { for(x2=x-c;x2!=x;x2++){tm[d]=df[x2]; //copie de la derniere "," a la suivante
    			                                   	d++;};   
                           c=0;
                           tab[dd] = x;  //je simplifie pour ecarter une erreur possible de sstream
                           dd++;
                           tm.clear();
                           }
                       else{          //si y'a pa de "," il y a au moin 1chiffre de plus
    	                    c++;}   //c: compteur du nombre de chiffre
                         };
     
    cout<<"k\n";  //il y avé une boucle for pour afficher tab, ca n'afficher que un 0 et plantage
    return 0;
    };

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Ton code est trop confus, essaye de le simplifier :
    - utilise un std::istringstream pour parser la chaine
    - utilise l'opérateur >> pour lire les entiers
    - utilise l'opérateur >> vers un char pour lire les séparateurs
    - utilise un std::vector<int> pour stocker les entiers

  3. #3
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    c ce k'il y avé a la place de

    c=0;
    tab[dd] = x; //je simplifie pour ecarter une erreur possible de sstream
    dd++;

    mais l'erreur ne vien pa de la.
    le code s'exectue jusqu'a la fin, et une erreur apparait
    enfin, celle de windows : erreur journal en cour de creation
    alors qu'il ne le créé meme pas.
    j'ai essayer de faire de debugage mais ca ne m'avance a rien
    je vé essayer de reecrire le code source pour demain
    pour eclaircir l'operation

    la parti qui remplacer avant tab[dd] = x;
    etait:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    istringstream istr( tm );
    istr >> tab[dd]; 
    tab[dd]=strtol(tm);

  4. #4
    Membre confirmé Avatar de toxcct
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 434
    Points : 511
    Points
    511
    Par défaut
    Citation Envoyé par biftek
    c ce k'il y avé a la place de

    c=0;
    tab[dd] = x; //je simplifie pour ecarter une erreur possible de sstream
    dd++;

    mais l'erreur ne vien pa de la.
    le code s'exectue jusqu'a la fin, et une erreur apparait
    enfin, celle de windows : erreur journal en cour de creation
    alors qu'il ne le créé meme pas.
    j'ai essayer de faire de debugage mais ca ne m'avance a rien
    je essayer de reecrire le code source pour demain
    pour eclaircir l'operation
    biftek, je n'ai pas tout cité, mais essaye d'écrire un peu plus français stp, ca améliorera la lisibilité sur ce thread.
    merci
    besoin de réponses ? demande a un pote

  5. #5
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    dsl, je ferai en sorte de m'apliqué pour demain.
    bonne soiré a tous (qui son sur notre continent)

  6. #6
    Membre confirmé Avatar de toxcct
    Développeur informatique
    Inscrit en
    Juillet 2006
    Messages
    434
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 434
    Points : 511
    Points
    511
    Par défaut
    Citation Envoyé par biftek
    dsl, je ferai en sorte de m'apliqué pour demain.
    bonne soiré a tous (qui son sur notre continent)
    je pense que tu peux t'y atteler dès aujourd'hui !!! lol

    ps: pourquoi tu dis pas bonsoir aux autres (qui sont pas sur "notre continent") ??
    besoin de réponses ? demande a un pote

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    780
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mai 2006
    Messages : 780
    Points : 1 174
    Points
    1 174
    Par défaut
    et en utilisant getline() ? à moins que ça soit un exo de cours.. désolé si c'est pas ce que tu veux faire, mais ça me parait plus simple

    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
    32
    33
     
    #include <string>
    #include <sstream>
    #include <vector>
    #include <iostream>
     
    int main(int argc, char* argv[])
    {
        // valeurs à insérer au tableau
        std::string values = "1,12,13";
     
        // tableau dynamique
        std::vector< int > intVector;
     
        // stream utilisé par getline    
        std::istringstream ssvalues( values );
        std::string wordFound;
     
        //getline renvoi chaque valeur séparée par ',' tant qu'il en reste dans wordFound
        while( std::getline( ssvalues, wordFound, ',' ) )
        {
            int intValue = 0;
     
            // conversion string vers int
            std::istringstream ssvalue( wordFound );   
            ssvalue >> intValue;
     
            // ajoute au vecteur
            intVector.push_back( intValue );                                     
        }
     
        return 0;
    }

  8. #8
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    oui c'est a peu pres ca.
    ben je leur di pas bonsoir parce qu'ils sont dans un fuseau horaire trop décaler
    (y'a l'afrique...)

  9. #9
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    donc j'ai tous réécris du debut, et bien sur pas de problème.
    Le programme reste toujours assez illisible mais ca marche.

    merci pour la solution avec le vecteur.
    voici donc le resultat:

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    #include <sstream>
    #include <string>
     
    using namespace std;
    #define np string::npos
     
    int str_int(string a);               //string to int
    int nbr_element(string a, int ln);  //retourne le nombre d'élément d'élimiter par ","
     
    int main()
    {string b;
    string tmp;       //pour la sous-chaine avec l'int
    int e, fc, nb;     //les position des "," et le nombre d'element
    int x=0;             //pour les boucles
    int ln, pos=1;  //pour la longeur de b, et la possition des copie dans res[]
    getline(cin,b);
     
    ln=b.length();
    nb=nbr_element(b,ln);
    int *res = new int[nb];     //on crée le tableau d'int
     
    e=b.find_last_of(",")  ;      //on recopie le dernier
    tmp.assign(b,e+1,ln-1);
    res[nb-1]=str_int(tmp);
    nb-=2;
     
    e=b.find(",",0);            //on recopie le premier
    tmp.assign(b,0,e);
    res[0]=str_int(tmp);
     
     
    x=1, e=0;
    while(x)                          //reperage des nombres et sauvgarde
    {e=b.find(",",e+1);
     fc=b.find(",",e+1);      // a partir du nouveau e
     
     if ((e!=np)&&(fc!=np))
        {
        tmp = b.substr(e+1,fc-e-1); 
        res[pos]=str_int(tmp);
        pos++;
        }
        else{
             x=0;
            };
    };
     
     
    nb=nbr_element(b,b.length());    //affichage du resultat
    for(x=0;x!=nb;x++)
    cout << res[x] << "\t";
    return 0;
     
    };
     
     
     
    int str_int(string a)
    {
        istringstream iss(a);
        int tm;
        iss>>tm;
        return tm;
    }
     
    int nbr_element(string a, int ln)
    {     int x=0, lc=0;
          while(x!=np)
                      {x=a.find(",",x+1);
                      if (x!=np)  //si a la possision x y'a une ","
                      lc++;
                        };
          lc++;
          return lc;
          };

  10. #10
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut correction
    je raconte n'importe quoi:
    merci a nikko34
    et en utilisant getline() ? à moins que ça soit un exo de cours.. désolé si c'est pas ce que tu veux faire, mais ça me parait plus simple
    , j'avé mal regarder, et avec une petite modif
    ca m'aurai fait gagner quelque heure
    entre autre la FAQ proposse une solution très proche:

    http://c.developpez.com/faq/cpp/?pag...#STRING_tokens

    encore merci a tous

  11. #11
    Futur Membre du Club
    Inscrit en
    Janvier 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 9
    Points : 5
    Points
    5
    Par défaut
    donc voila le resultat final


    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
     
    #include <cstdlib>
    #include <iostream>
    #include <stdlib.h>
    #include <sstream>
    #include <string>
     
    using namespace std;
     
    #define np string::npos
     
    int str_int(string a);
    int nbr_element(string a); //, int ln);
     
    int main()
    {
    string tmp;     //pour la sous-chaine avec l'int
    int e, fc, nb;  //les position des "," et le nombre d'element
    int x=0;        //pour les boucles
    int ln, pos=0;  //pour la longeur de b, et la possition des copie dans res[]
    string b;
    istringstream iss;
     
    getline(cin,b);
    iss.str(b);     //affectation
    ln=b.length(); //longeur ...
    nb=nbr_element(b);
     
    int *res = new int[nb]; // on crée le tableau d'int
     
    while ( getline( iss, tmp, ',' ) )  //d'apres la FAQ extraction grace au delimiteur
    {res[pos]=str_int(tmp);
    pos++;}
     
    nb=nbr_element(b);
    for(x=0;x!=nb;x++)
    cout << res[x] << "\t";
    return 0;
    };
     
     
    int str_int(string a)
    {
        istringstream iss(a);
        int tm;
        iss>>tm;
        return tm;
    };
     
    int nbr_element(string a) 
    {     int lc=0, x=0;      
          while (x!=np) 
          {x=a.find(",",x+1);
          lc++;}
          return lc;
          };

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

Discussions similaires

  1. [Debutant]Transformer string en int
    Par htaou dans le forum SL & STL
    Réponses: 7
    Dernier message: 09/09/2005, 21h28
  2. [Débutant] Conversion d'un String en Int
    Par chleuh dans le forum Langage
    Réponses: 9
    Dernier message: 30/12/2004, 13h33
  3. [débutant] String ou int
    Par pingoui dans le forum Langage
    Réponses: 42
    Dernier message: 16/09/2004, 09h16
  4. Réponses: 2
    Dernier message: 21/06/2004, 15h55
  5. [FLASH MX 2004] conversion string en int.
    Par calfater dans le forum Flash
    Réponses: 3
    Dernier message: 26/05/2004, 15h00

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