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 :

conversion string en int


Sujet :

C

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 83
    Points : 52
    Points
    52
    Par défaut conversion string en int
    Bonjour,

    Je me demande comment faire pour convertir une chaime de caractere en entier, en effet, j'extrais avec strtok une chaine (par ex "10") et j'ai besoin de faire un calcul dessus

    Pour l'instant j'ai trouvé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int nombre;
    nombre = (char*) *chaine;
    Mais ca me renvoi le code ASCII...

    si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    nombre = (char*) chaine;
    ca me converti en entier l'adresse memoire de chaine (normal...)

    mais je n'arrive pas a obtenir tout simplement 10...

    Si quelqu'un pouvait me conseiller

    Merci par avance

    Edenyorke

  2. #2
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par edenyorke
    Je me demande comment faire pour convertir une chaime de caractere en entier
    Il existe des fonctions de conversion texte -> numérique comme strtol(), strtoul()... Ton livre de C ou la FAQ t'en diront plus...

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    C'est dans la FAQ, faut les lire c'est tout: Comment convertir une chaîne de caractères en nombre ?



  4. #4
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par Franck.H
    C'est dans la FAQ, faut les lire c'est tout: Comment convertir une chaîne de caractères en nombre ?


    J connais pas grand chose aux fonctions c, mais c'est quoi la diff entre strtol et atoi?

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 381
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 381
    Points : 41 581
    Points
    41 581
    Par défaut
    Il me smeble qu'en plus d'indiquer où s'arrête la conversin et de permettre de choisir la base, strtol() fait un contrôle de débordement, convertissant tout nombre trop grand en LONG_MAX...

  6. #6
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par ®om
    J connais pas grand chose aux fonctions c, mais c'est quoi la diff entre strtol et atoi?
    D'après le man de atoi:
    La fonction atoi() convertit le début de la chaîne pointée par nptr en entier de type int. Le résultat est identique à un appel

    strtol(nptr, (char **)NULL, 10);


    à la différence que atoi() ne détecte pas d'erreur.

  7. #7
    Membre éclairé Avatar de homeostasie
    Homme Profil pro
    Inscrit en
    Mai 2005
    Messages
    939
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 939
    Points : 862
    Points
    862
    Par défaut
    Citation Envoyé par Medinoc
    Il me smeble qu'en plus d'indiquer où s'arrête la conversin et de permettre de choisir la base, strtol() fait un contrôle de débordement, convertissant tout nombre trop grand en LONG_MAX...
    et tout nombre trop petit (underflow) en LONG_MIN.

  8. #8
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par ®om
    J connais pas grand chose aux fonctions c, mais c'est quoi la diff entre strtol et atoi?
    atoi() est limité au format texte décimal, et ne détecte pas les dépassements de capacités (errno == ERANGE).

    A l'occasion de la normalisation du langage C en 1989, les fonctions ato*() on été 'doublées' par les fonctions strto*(), rendant automatiquement les fonctions ato*() obsolètes (c'est à dire à ne pas utiliser dans de nouveaux développements).

    Evidemment, personne n'y a prété attention et, même en 2006, on continue à enseigner l'usage de atoi()... Y'a des trucs comme ça qui m'énervent...

  9. #9
    Membre expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Y'a des trucs comme ça qui m'énervent...
    Héhé, je n'étais pas au courant pour strto*...
    Je crois que c'est (aussi) la faute de certains cours, avec des profs qui ont appris les languages il y a longtemps...

    Moi qui suis plus "java", c'est exactement la même chose, les gens utilisent Vector, Hashtable, Stack, Enumeration... Alors que comme pour atoi -> strtoi il y a les équivalents "corrects" de chacune de ces classes...

  10. #10
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Points : 12 462
    Points
    12 462
    Par défaut
    Citation Envoyé par ®om
    Héhé, je n'étais pas au courant pour strto*...
    Je crois que c'est (aussi) la faute de certains cours, avec des profs qui ont appris les languages il y a longtemps...
    C'est rien ca ... après pas mal de cours et exercices en C, j'en connais certains qui ne connaissaient même pas les fonction ato* alors des fonctions plus évoluées ... J'estime toutefois, rien que pour des raisons historique du langage, que même certaines anciennes fonctions doivent faire parties des cours !

  11. #11
    Membre du Club
    Inscrit en
    Novembre 2005
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 75
    Points : 62
    Points
    62
    Par défaut
    j'ai dejà utilisé atoi et j'ai pas eu de probleme, au contraire j'ai meme ete ravi car avec les limites de ma connaissance actuelle sur le C je ne pouvais ecrire une fonction qui puisse traduire une chaine en nombre sauf si tu songes à te servir des switch et case... et aussi est assez simple; voici un exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /* atoi example */
    #include <stdio.h>
    #include <stdlib.h>
     
    int main ()
    {
      int i;
      char szInput [256];
      printf ("Enter a number: ");
      gets ( szInput );
      i = atoi (szInput);
      printf ("Value entered is %d, and its double %d",i,i*2);
      return 0;
    }
    PS ! j'entends souvent que gets() a une mauvaise reputation , alors à sa place tu peux utilise sscanf

  12. #12
    Membre régulier
    Inscrit en
    Octobre 2006
    Messages
    123
    Détails du profil
    Informations forums :
    Inscription : Octobre 2006
    Messages : 123
    Points : 77
    Points
    77
    Par défaut ok
    sinon code ta propre fonction qui te permettra a l'avenir de mieux comprendre la fonction strol ou d'autres!

    exemple avec str = "19999"
    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
     
    int     my_getnbr(char *str)
    {
      int   res;
     
      if (*str == '-')
        return (-my_getnbr(str + 1));
      if (*str == '+')
        return (my_getnbr(str + 1));
      res = 0;
      while (*str)
        {
          res *= 10;
          res += *str - '0';
          str++;
        }
      return (res);
    }
     
     
    int     main()
    {
      char  *str ;
      int   i;
     
      str = "199999";
      i = my_getnbr(str);
      printf("%d", i);
    }
    Compile et teste!

  13. #13
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par salif98
    j'ai dejà utilisé atoi et j'ai pas eu de probleme
    le gros souci avec atoi (outre le fait qu'il n'est pas possible d'indiquer la base utiliser) est son absence de gestion d'erreur sur la conversion, il est impossible de savoir si une conversion a pu etre faite ou non ni si toute la chaine a ete convertie ou simplement le debut.
    Probleme que les fonctions strto...() precedemment citee corrige.

    Citation Envoyé par salif98
    PS ! j'entends souvent que gets() a une mauvaise reputation , alors à sa place tu peux utilise sscanf
    gets() ne permet pas de verifier la taille de la chaine lue, ce qui introuduit un risque de debordement de buffer. Il est preferable d'utiliser fgets() qui corrige se probleme.
    sscanf() travaillant pour sa part sur une chaine et non sur un flux n'est pas une alternative possible et scanf() bien que pouvant gerer ce cas de figure est beaucoup plus complexe a utiliser.

  14. #14
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par salif98
    j'ai dejà utilisé atoi et j'ai pas eu de probleme, au contraire j'ai meme ete ravi car avec les limites de ma connaissance actuelle sur le C je ne pouvais ecrire une fonction qui puisse traduire une chaine en nombre sauf si tu songes à te servir des switch et case...
    Curieux... L'exemple de la FAQ n'a pourtant pas l'air trop compliqué !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char buf[32]="15";
    long n;
    n=strtol(buf, NULL, 10);
    Citation Envoyé par salif98
    PS ! j'entends souvent que gets() a une mauvaise reputation , alors à sa place tu peux utilise sscanf
    Euh, ben en fait, c'est (presque) l'inverse qu'il faut faire !
    Utiliser fgets, sauf si tu maitrises le format de la chaine traitée par sscanf...

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par salif98
    j'entends souvent que gets() a une mauvaise reputation , alors à sa place tu peux utilise sscanf
    Non.

  16. #16
    Membre éprouvé Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Points : 1 260
    Points
    1 260
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Non.
    Clair, net, précis !

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

Discussions similaires

  1. [error] conversion string en int
    Par CPI_en_mousse dans le forum Langage
    Réponses: 2
    Dernier message: 03/05/2007, 11h48
  2. Réponses: 7
    Dernier message: 26/10/2006, 16h50
  3. [C#] Conversion string to int
    Par OpenGG dans le forum C#
    Réponses: 2
    Dernier message: 23/08/2006, 19h08
  4. conversion string vers int
    Par mathher dans le forum C++
    Réponses: 4
    Dernier message: 14/04/2006, 17h52
  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