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 :

convertir un string en int


Sujet :

C

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 65
    Points : 77
    Points
    77
    Par défaut convertir un string en int
    je veux convertir des string qui contient des entiers en hexadécimal en entiers de type int, pouvez-vous m'aider svp? merci.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 726
    Points : 31 046
    Points
    31 046
    Billets dans le blog
    1
    Par défaut
    Oui, bonjour à toi aussi. Si ça te dérange de mettre un exemple plus concret tu nous le dis surtout. Des fois que ça nous rendrait la tache trop facile...

    Donc la méthode pour convertir une string contenant "123" en nombre 123 est la suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    mettre val à 0
    mettre i à 0
    tant que string[i] != '\0' faire
        val=val * 10 + string[i] - '0'
        i=i+1
    fin faire
    Pourquoi val * 10 ? Pour décaler les puissances de 10 (123 c'est 1 * 10 * 10 + 2 * 10 + 3). Et pourquoi string[i] - '0' ? Ben parce que le caractère '2' vaut 50 dans la table ascii. Et pour passer de 50 à 2 il faut enlever 48 qui est justement la valeur ascii du caractère '0' (comme quoi, les coïncidences parfois...)

    Donc voilà. Ensuite ben pour adapter cette méthode de chaine décimale (base "10") à une chaine hexadécimale (base "16") te suffit d'un peu d'astuce, d'espièglerie et c'est la vie de Candy.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 65
    Points : 77
    Points
    77
    Par défaut
    exemple:
    string s= "4b0";
    int y;
    y=convert(s);
    y=1200;
    convert()???
    je cherche comment je peut faire la conversation
    Merci beaucoup.

    J'ai bien compris votre méthode pour les entiers, mais pour l'hexadécimal, j'ai pas compris comment je peut la faire.
    Merci beaucoup

  4. #4
    Membre émérite
    Avatar de Daïmanu
    Homme Profil pro
    Développeur touche à tout
    Inscrit en
    Janvier 2011
    Messages
    713
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur touche à tout

    Informations forums :
    Inscription : Janvier 2011
    Messages : 713
    Points : 2 362
    Points
    2 362
    Par défaut
    Bonsoir.

    Si tu peux travailler en C++11, la bibliothèque standard propose la fonction std::stoi(). Cette dernière accepte trois arguments, le dernier étant la base à utiliser pour faire la conversion.

    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    #include <iostream>
     
    int main(int argc, char *argv[]) {
    	std::cout << std::stoi("4b0", 0, 16) << std::endl; //écrit 1200 sur stdout
    	return 0;
    }
    Sinon, l'algorithme de conversion n'est pas très compliqué, une simple recherche sur le net te fournira pléthores d'exemples.

  5. #5
    Membre du Club Avatar de diesel83
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Décembre 2014
    Messages
    57
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Décembre 2014
    Messages : 57
    Points : 51
    Points
    51
    Par défaut
    Bonsoir,

    Et pourquoi pas un petit sscanf() ?

    taper "sscanf" dans google et il y a plein d'exemples.

    Jean-Marie

  6. #6
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 65
    Points : 77
    Points
    77
    Par défaut
    Merci beaucoup, c'est gentil

  7. #7
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 726
    Points : 31 046
    Points
    31 046
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Imene MI Voir le message
    J'ai bien compris votre méthode pour les entiers, mais pour l'hexadécimal, j'ai pas compris comment je peut la faire.
    Preuve que t'as pas vraiment compris le principe général des bases...

    Citation Envoyé par Imene MI Voir le message
    string s= "4b0";
    int y;
    y=convert(s);
    y=1200;
    convert()???
    je cherche comment je peut faire la conversation
    De la même façon que "123" font 123. Dans ce cas il faut faire ('1' - '0') * 10 * 10 + ('2' - '0') * 10 + ('3' - '0'); et dans le cas de "4b0" il faut faire ('4' - '0') * 16 * 16 + 11 * 16 + ('0' - '0'). C'est donc exactement la même méthode à part qu'il faut juste faire un test en plus sur string[i] pour détecter le cas de 'a', 'b', 'c', 'd', 'e' ou 'f'...

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 65
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par Sve@r Voir le message


    De la même façon que "123" font 123. Dans ce cas il faut faire ('1' - '0') * 10 * 10 + ('2' - '0') * 10 + ('3' - '0'); et dans le cas de "4b0" il faut faire ('4' - '0') * 16 * 16 + 11 * 16 + ('0' - '0'). C'est donc exactement la même méthode à part qu'il faut juste faire un test en plus sur string[i] pour détecter le cas de 'a', 'b', 'c', 'd', 'e' ou 'f'...
    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
      string str="4a0";
        int  val=0;
         int  i=0;
         while (str[i] != '\0') 
         {
               switch (str[i])
               {
                      case 'a': 
                      val=val * 16 + '10' - '0';
                      break;
                      case 'b':
                      val=val * 16 + '11' - '0';
                      break;
                      case 'c': 
                      val=val * 16 + '12' - '0';
                      break;
                      case 'd':
     
                      val=val * 16 + '13' - '0';
                      break;
                      case 'e':
                          val=val * 16 + '14' - '0';
                      break;
                      case 'f':
                      val=val * 16 + '15' - '0';
                      break;
                      default:
                      val=val * 16 + str[i] - '0';  
                     break;
                     }
         i=i+1;}
    Voilà ce que j'avais fait, mais ça marche pas, pouvez-vous me corriger svp?

  9. #9
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 038
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 038
    Points : 8 405
    Points
    8 405
    Par défaut
    salut,

    Citation Envoyé par Imene MI Voir le message
    sauf erreur le type string est un type issu du C++, ton post est dans la section C, tu codes dans lequel des deux ?

    Citation Envoyé par Imene MI Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    val=val * 16 + '10' - '0';
    c'est censé être quoi ce '10' ? un char ? une string ? un int ?

  10. #10
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 672
    Points : 10 680
    Points
    10 680
    Par défaut
    Tu comptes faire quoi avec CE CARACTÈRE '10'?

    Tu sais si int = ('5' - '0') fonctionne, c'est également le cas de int = ('b' - 'a') // or ('B' - 'A'): zieute la table ASCII pour t'en convaincre

  11. #11
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 65
    Points : 77
    Points
    77
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    salut,


    sauf erreur le type string est un type issu du C++, ton post est dans la section C, tu codes dans lequel des deux ?

    c'est censé être quoi ce '10' ? un char ? une string ? un int ?
    Bon jour, je travail avec c++.
    je suivre la méthode de monsieur Sve@r. je faire la soustraction entre le code ASCII de '10' et '0' pour obtient la valeur 10

    Citation Envoyé par foetus Voir le message
    Tu comptes faire quoi avec CE CARACTÈRE '10'?

    Tu sais si int = ('5' - '0') fonctionne, c'est également le cas de int = ('b' - 'a') // or ('B' - 'A'): zieute la table ASCII pour t'en convaincre
    je faire la soustraction entre le code ASCII de '5' et '0' pour obtient la valeur 5 en entier par exemple j'ai le caractère '5' et je veux transformer en entier

  12. #12
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 038
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 038
    Points : 8 405
    Points
    8 405
    Par défaut
    Citation Envoyé par Imene MI Voir le message
    je travail avec c++.
    ok, donc pour info la solution de Daïmanu plus haut est valable en C++, l'algorithme proposé par Sve@r n'est pas complet et uniquement une piste de réflexion, plutot que d'essayer de l'implémenter tel quel je t'encourage vivement à essayer de le comprendre, il te donne les grandes lignes

    le code ASCII de '10'
    ça n'est pas bon, 10 est composé de 2 caractères, c'est donc une chaine de caractères (char[]en C, ou string en C++), les chaines de caractères sont entre double-quotes " tandis qu'on ne peut mettre qu'un seul caractère entre des simple-quotes '

    dans la continuité de ce que propose Sve@r, tu pourrais envisager de rajouter (et utiliser) une variable du genre string hexdigits = "0123456789abcdef"; dans ton code, ça risque de t'aider

  13. #13
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 672
    Points : 10 680
    Points
    10 680
    Par défaut
    Citation Envoyé par BufferBob Voir le message
    ça n'est pas bon, 10 est composé de 2 caractères, c'est donc une chaine de caractères (char[]en C, ou string en C++), les chaines de caractères sont entre double-quotes " tandis qu'on ne peut mettre qu'un seul caractère entre des simple-quotes '
    et ces caractères '\0' '\n' '\t' '\r' se sont aussi des chaînes de caractères

  14. #14
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 038
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 038
    Points : 8 405
    Points
    8 405
    Par défaut
    Citation Envoyé par foetus Voir le message
    et ces caractères '\0' '\n' '\t' '\r' se sont aussi des chaînes de caractères
    tu troll ?
    \ est le caractère d'échappement, j'essaye juste de formuler les choses de manière simple, plutôt que d'être exhaustif au risque de compromettre la compréhension
    (d'ailleurs si je ne me trompe pas, il n'y a pas à proprement parler de "chaines" en langage C non plus )

  15. #15
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 672
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 672
    Points : 10 680
    Points
    10 680
    Par défaut
    Dis-lui alors que c'est un problème de logique parce qu'il n'aura jamais 10

    • En décimal, ce sera '1' et '0': donc 1 * 10 + 0
    • En héxa: 10 c'est 16: 1 * 16 + 0. Ou alors 10 c'est 'A' ... parce qu'on ne sait jamais à quelle base ce nombre est rattachée

  16. #16
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2015
    Messages
    65
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2015
    Messages : 65
    Points : 77
    Points
    77
    Par défaut
    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
     while (str[i] != '\0') 
         {
               switch (str[i])
               {
                      case 'a': 
                           {
                      val=val * 16 + 10;}
                      break;
                      case 'b':
                     { val=val * 16 + 11;}
                      break;
                      case 'c': 
                      {val=val * 16 + 12;}
                      break;
                      case 'd':
     
                     { val=val * 16 + 13;}
                      break;
                      case 'e':
                         { val=val * 16 + 14;}
                      break;
                      case 'f':
                      {val=val * 16 + 15;}
                      break;
                      default:
                     { val=val * 16 + str[i] - '0';  }
                     break;
               }
         i=i+1;}
    Merci beaucoup, j'arrive à corriger ma faute et ça marche très bien avec cette méthode. Merci pour tous qui m'ont aidé

  17. #17
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 726
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 726
    Points : 31 046
    Points
    31 046
    Billets dans le blog
    1
    Par défaut
    Déjà pas besoin de break sur le default. Sinon tu peux peut-être sortir le *16 puisque c'est quelque chose que tu fais dans tous les cas. Et enfin les instructions initialisation; while (...); increment rentrent très bien dans un for (...)...

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

Discussions similaires

  1. [C#] Convertir une String en Int ?
    Par Kylen dans le forum ASP.NET
    Réponses: 12
    Dernier message: 11/04/2012, 10h59
  2. Convertir un string en int
    Par m.borghesi dans le forum Langage
    Réponses: 5
    Dernier message: 03/11/2010, 15h02
  3. Comment convertir un String en int[]
    Par mundu dans le forum Langage
    Réponses: 3
    Dernier message: 20/01/2009, 00h12
  4. Convertir un String en Int
    Par Gr@nd@x dans le forum Langage
    Réponses: 4
    Dernier message: 03/04/2007, 22h40
  5. convertir un String en int
    Par Sakapatate dans le forum Langage
    Réponses: 4
    Dernier message: 07/12/2006, 14h29

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