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 :

Transformer un String en décimal,fonction personelle.


Sujet :

C

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 16
    Par défaut Transformer un String en décimal,fonction personelle.
    Bonjour ,

    Comme exercice je fait une fonction qui vas transformer
    une chaine de caractere en chiffre décimal ,

    mais si je place un chiffre de 3 ou 5 lettres ,
    il ne me renvoye pas le bon résultat ,
    exemple » "345" il me renvoye 344 ,
    voici le code , merci pour vos réponses .:-) Idefix

    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
    76
    #include <stdio.h>
    #include <stdlib.h>
     
    long strtoint(const char *chaine);
     
    int main(int argc, char *argv[])
    {
      int chiffre = 0 ;
      char monchiffre[13] = {0};//De 0 a 11 caracteres
      //affectation...
      monchiffre[0] = '3' ;monchiffre[1] = '4' ;monchiffre[2] = '5' ;
     
      chiffre = strtoint(monchiffre);//Appel de la procedure 'strtoint'
      printf("Chiffre de la chaine: %s est :%d\n",monchiffre,chiffre) ;
     
      system("PAUSE");
      return 0;
    }
     
    long strtoint(const char *chaine)
    {
      long longueurChaine = strlen(chaine);//longueur de la chaine
      //cptinterne = compteur qui décrémente
      long compteur = 0 , cptinterne = longueurChaine-1 , chiffre = 0 ;
      double base = 10 ;
      for (compteur = 0 ; compteur <= longueurChaine-1 ; compteur++)
            {
        switch (chaine[compteur])
              {
                      case '0':
                             cptinterne-- ;
                      break;
                      case '1':
                             chiffre += 1 * (pow(base, cptinterne));
                             cptinterne-- ;
                      break;
                      case '2':
                             chiffre += 2 * (pow(base, cptinterne));
                             cptinterne-- ;
                      break;
                      case '3':
                             chiffre += 3 * (pow(base, cptinterne));
                             cptinterne-- ;
                      break;
                      case '4':
                             chiffre += 4 * (pow(base, cptinterne));
                             cptinterne-- ;
                      break;
                      case '5':
                             chiffre += 5 * (pow(base, cptinterne));
                             cptinterne-- ;
                      break;
                      case '6':
                             chiffre += 6 * (pow(base, cptinterne));
                             cptinterne-- ;
                      break;
                      case '7':
                             chiffre += 7 * (pow(base, cptinterne));
                             cptinterne-- ;
                      break;
                      case '8':
                             chiffre += 8 * (pow(base, cptinterne));
                             cptinterne-- ;
                      break;
                      case '9':
                             chiffre += 9 * (pow(base, cptinterne));
                             cptinterne-- ;
                      break;
                      default:
                             chiffre = 0 ;
                             chaine = "" ;
                      break;
              }
            }
      return chiffre ;
    }

  2. #2
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    j'ai mis un trace pour afficher le chiffre à chaque tour de boucle,c'est le résultat après le passage dans les cas 3,4 et 5.

    visiblement 3*100 donne à l'affichage 299

    299
    339
    344
    Chiffre de la chaine: 345 est :344

    Press ENTER to continue.
    la fonction pow renvoi un double que tu stockes dans un long qui fait 4 octets sur ma machine de même qu'un int tandis qu'un double fait 8 octets.

    je n'ai aucune idée de comment se passe la conversion pour faire entrer un double (ou un float ou un long double selon la fonction pow utilisée) dans un long (chapitre conversion sur les types)

    j'ai testé avec le prototype float et double ca donne des résultats tout aussi approximatif

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 16
    Par défaut
    Merci hegros pour la réponse ,
    ca devrais dire que je doit aussi réécrire un nouveaux 'pow' ?

    Je place ici ma solution pour les personnes que ca intéressent ...

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    #include <stdio.h>
    #include <stdlib.h>
     
    long _exp(const long E);
    long strtoint(const char *chaine);
     
    int main(int argc, char *argv[])
    {
      long chiffre = 0 ;
      char monchiffre[13] = {0};//De 0 a 11 caracteres
      //affectation...
      monchiffre[0] = '3' ;monchiffre[1] = '0' ;monchiffre[2] = '2' ;monchiffre[3] = '5' ;
      //monchiffre[4] = '0' ;monchiffre[5] = '0' ;monchiffre[6] = '5' ;monchiffre[7] = '1' ;
     
      chiffre = strtoint(monchiffre);//Appel de la procedure 'strtoint'
      printf("Chiffre de la chaine: %s est :%ld\n",monchiffre,chiffre) ;
     
      system("PAUSE");
      return 0;
    }
     
    long _exp(const long E)
    {
      int i = 0 , Ep = 1 ;
      if (E > 1)
      {
        for (i=1 ; i<=E-1 ; i++)
        {
          Ep *= 10 ;
        }
        return Ep ;
      }
      if (E == 1)
      {
        return 1 ;
      }
      if (E == 0)
      {
        return 0 ;
      }
    }
     
    long strtoint(const char *chaine)
    {
      long longueurChaine = strlen(chaine);//longueur de la chaine
      //cptinterne = compteur qui décrémente
      long compteur = 0 , cptinterne = longueurChaine , chiffre = 0 ;
      long base = 10 ;
      for (compteur = 0 ; compteur <= longueurChaine-1 ; compteur++)
            {
        switch (chaine[compteur])
              {
                      case '0':
                             cptinterne-- ;
                      break;
                      case '1':
                             chiffre += 1 * _exp(cptinterne) ;
                             cptinterne-- ;
                      break;
                      case '2':
                             chiffre += 2 * _exp(cptinterne);
                             cptinterne-- ;
                      break;
                      case '3':
                             chiffre += 3 * _exp(cptinterne);
                             cptinterne-- ;
                      break;
                      case '4':
                             chiffre += 4 * _exp(cptinterne);
                             cptinterne-- ;
                      break;
                      case '5':
                             chiffre += 5 * _exp(cptinterne);
                             cptinterne-- ;
                      break;
                      case '6':
                             chiffre += 6 * _exp(cptinterne);
                             cptinterne-- ;
                      break;
                      case '7':
                             chiffre += 7 * _exp(cptinterne);
                             cptinterne-- ;
                      break;
                      case '8':
                             chiffre += 8 * _exp(cptinterne);
                             cptinterne-- ;
                      break;
                      case '9':
                             chiffre += 9 * _exp(cptinterne);
                             cptinterne-- ;
                      break;
                      default:
                             chiffre = 0 ;
                             chaine = "" ;
                      break;
              }
            }
      return chiffre ;
    }

  4. #4
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    je te propose la solution suivante, qui me parait plus simple et qui ne nécessite pas l'utilisation de la fonction pow :
    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
     
    long strtoint(const char *chaine) {
        int i, base=10, n, longueurChaine=strlen(chaine);
        long chiffre=0, basecur=1;
     
        for (i=longueurChaine-1;i>=0;i--) {
            if ( chaine[i]>='0' && chaine[i]<='9' ) {
                n = chaine[i] - '0';
                chiffre = chiffre + n * basecur;
                basecur = basecur * base;
            }
        }
     
        return chiffre ;
    }
     
    int main(void) {
        long chiffre = 0;
        char monchiffre[13] = {0};//De 0 a 11 caracteres
     
        printf("Veuillez entrer un nombre : ");
        fgets(monchiffre,13,stdin);
        chiffre = strtoint(monchiffre);
     
        printf("Chiffre de la chaine %s est : %ld\n",monchiffre,chiffre);
     
        return 0;
    }

  5. #5
    Membre confirmé
    Homme Profil pro
    Ingénieur systèmes embarqués
    Inscrit en
    Janvier 2006
    Messages
    81
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur systèmes embarqués
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 81
    Par défaut
    Bonjour
    J'ai trouvé cette petite fonction il n'y a pas longtemps :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #include <stdio.h>
     
    char buffer[256];
    int variable = 12;
    int verification;
     
    verification = sprintf(buffer,"%d",variable);
    printf("%s\n",buffer);

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Citation Envoyé par F0ul Voir le message
    Bonjour
    J'ai trouvé cette petite fonction il n'y a pas longtemps :

    <snip>
    Le titre du thread dit "fonction personnelle".
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 16
    Par défaut Merci
    Merci a tous ,
    quand je vois les réponses je constate que je suis vraiment un débutant
    mais on est la pour apprendre et s'accrocher

    C'est vraix que je voulais une fonction personnelle ...
    parce que on apprend plus a faire tout soit-meme
    que de recopier un code sans rien comprendre ....


    Je vais donc étudier la solution de corentin59 ,
    merci a toi .

    :-) Idefix

    ps:Communauté sympathique merci a tous
    ca me donne envie de continuer la programmation .

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 16
    Par défaut Question ?
    Question a corentin59 ,

    je comprend presque tout ton code sauf cette ligne : n = chaine[i] - '0';
    a quoi sert le : -'0' ?

    merci pour ta réponse .

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 398
    Par défaut
    Pour passer des valeurs 48~57 ('0'~'9') aux valeurs 0~9.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 16
    Par défaut Merci
    Merci Médinoc ,

    c'est plus clair dans ma tete

  11. #11
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    Le titre du thread dit "fonction personnelle".
    D'ailleurs il n'a même pas répondu à la question. Il s'agit de convertir une chaîne en nombre et non l'inverse, donc il aurait au moins utilisé sscanf, mais finalement pourquoi ne pas faire avec les fonctions plus adaptées (strtol et compagnie).

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 16
    Par défaut
    Bonjour Melem ,

    La premiere chose c'est que je voulais essayer de le programmer
    cette fonction , pour apprendre et comme exercice ...
    la deuxieme chose c'est que je suis un super débutant pas loin du zéros
    donc je connais pas toute les fonctions du c , et ni des librairies offertes ....

    Bonne journée , ha oui ici c'est le canada , bonsoir aux Européens , Idefix

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 6
    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
    int     char_to_int(char *str)
    {
      int   i;
      int   nbr;
      int   l;
     
      i = 0;
      l = 1;
      nbr = 0;
      while (str[i])
        i++;
      while ((i - 1) >= 0)
        {
          nbr = nbr + ((str[i - 1] - 48) * l);
          l = l * 10;
          i--;
        }
      return (nbr);
    }
     
    int     main(int ac, char *av)
    {
      int   nb;
     
      nb = char_to_int("42");
      printf("%d \n", nb);
      return (0);
    }
    Voila une fonction que tu peux faire toi meme et qui transforme une chaine en int.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 16
    Par défaut
    Merci stevin ,

    je vais étudier celle la aussi

  15. #15
    Membre chevronné Avatar de corentin59
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    462
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 462
    Par défaut
    Citation Envoyé par stevin Voir le message
    Voila une fonction que tu peux faire toi meme et qui transforme une chaine en int.
    Ce code est très similaire dans l'esprit au mien. qq commentaires
    Citation Envoyé par stevin Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    i = 0;
    while (str[i])
        i++;
    il y a quand même plus simple pour connaitre la taille d'une chaine, à moins qu'on ne veuille utiliser vraiment aucune fonction toute faite.
    Citation Envoyé par stevin Voir le message
    pourquoi faire une soustraction à chaque itération, c'est plus simple de faire

  16. #16
    Membre éprouvé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    115
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 115
    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
    int     str_to_int(char *str)
    {
      int   result, mult, i;
     
      result = 0;
      mult = 1;
      for (i = 0; *(str + i) == '-' || *(str + i) == '+'; i++)
        mult = (*(str + i) == '-') ? -mult : mult;
      while (*(str + i) <= '9' && *(str + i) >= '0')
        result = (result * 10) + (*(str + i++) - '0');
      return (result * mult);
    }
    Qui gere les negatifs et le "+-++----+-".
    Il s'arrete au premier caractere qui n'est pas un chiffre trouvé.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/02/2013, 05h15
  2. Réponses: 3
    Dernier message: 06/06/2011, 21h20
  3. Transformer une String en fonction
    Par Jevil dans le forum MATLAB
    Réponses: 12
    Dernier message: 07/02/2008, 23h46
  4. [XSLT] Transformer un String contenant du xml
    Par VinceFromBcn dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 07/07/2004, 12h42
  5. Transformer un String en InputStream
    Par felix79 dans le forum Entrée/Sortie
    Réponses: 5
    Dernier message: 07/07/2004, 12h18

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