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 integer en string


Sujet :

C

  1. #21
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par Emcy
    et comment fait-on pour insérer des 0 (vu que je veux qu'il y ai toujour 4 chiffres d'affichés)
    Excusez-moi, j'avais oublié ce détail.

    Citation Envoyé par Emcy
    j'ai utilisé cette methode (pas encore testée) : n'est-elle pas un peu lourde ?
    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
    itoa(TabVLAN_Filter[myRow].ID, StringTemp);
    itoa() prend 3 paramètres
    		j = 4;
    		k=0;
    		while (StringTemp[j]!='\0')
    		{
    			chaine_debug[k++] = '0';
    Il y a au moins un problème dans cette boucle car j ne varie pas.
    		}
    		
    		l = 0;
    		for ( j = k; j < 5; j++ ){
    			chaine_debug[j] = StringTemp[l++];
    		}
    Le mieux est encore de créer votre propre fonction de conversion, soit en supposant qu'il n'y aura jamais plus de 4 chiffres et que l'on veut une conversion en décimal (et que le nombre est positif):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    char *itoa4(int i,char *s)
     {
     int j;
     
     s[4]=0;
     for (j=3;j>=0;--j)
      {
      s[j]=i%10+'0';
      i/=10;
      }
     return s;
     }

  2. #22
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par Emcy
    et comment fait-on pour insérer des 0 (vu que je veux qu'il y ai toujour 4 chiffres d'affichés)

    j'ai utilisé cette methode (pas encore testée) : n'est-elle pas un peu lourde ?
    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
     
    /*
    	myiota: 
    		converts an int in [0,4095] range into a 4 chars string left filled with 0
    		*outstr should points on a string buffer of at least 5 chars 		
    */
     
    void myitoa(unsigned short num,char *outstr)
    {
    #define BASE	(10)
    	int q, r ;
    	char *s = outstr + 3 ;
     
    	outstr[0] = '0' ;
    	outstr[1] = '0' ;
    	outstr[2] = '0' ;
    	outstr[3] = '?' ;
    	outstr[4] = '\0' ;
     
    	if (num > 4095)
    		return ;
     
    	do {
    		r = num % BASE ;
    		q = num / BASE ;
    		*s-- = r + '0' ;
     
    		num = q ;
    	}
    	while (num) ;
     
    #undef BASE		
    }

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Emcy
    bonjours,

    j'ai un entier compris entre 0 et 4095
    => comment faire pour le convertir en une chaine de caractère qui fasse toujours 4 caractères ?

    ex : 1 => "0001"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       char chaine[5];
       sprintf (chaine, "%04u", entier_non_signe);

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Emcy
    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
    extern char chaine_debug[70]; // variable global
     
    static unsigned char myRow; // variable locale
     
    // ******** structure VLAN Filter ********************
     
    typedef struct _StructA
    {
    	unsigned int Enb:1;
    	unsigned int Member:5;
    	unsigned int NU:2; // bits non utilisés
    } StructA;
     
    typedef struct _StructB
    {
    	unsigned int Priority:3;
    	unsigned int Tagged:5;
    } StructB;
     
    typedef struct _StructVLAN
    {
    	unsigned int ID;
    	StructA A;
    	StructB B;
    } StructVLAN;
     
    extern StructVLAN TabVLAN_Filter[16]; // variable global
    // ***************************************************
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(chaine_debug, "%04u", TabVLAN_Filter[myRow].ID);
    Faut pas chercher des trucs tordus ou compliqués...

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par stephl
    Le & devant un nom de tableau n'est pas utilisé normalement, cependant ce n'est pas une erreur et &a signifie a si a est un tableau.
    Si, c'est une erreur de compréhension du langage C. C'est grave.

    • a désigne un tableau de N éléments de type T. Il a pour valeur l'adresse du premier élément du tableau. Il a pour type T*.
    • &a est l'adresse du tableau. Il a certes la même valeur que a mais le type est différent : T(*)[N]. (EDIT)

    si jamais a est un pointeur, c'est le drame.

    Donc pas de &.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par stephl
    Normalement, sprintf() doit fonctionner sur toute implémentation standard. Sinon, il vous reste toujours itoa() (<stdlib.h>).
    Cette fonction n'est pas standard.

    http://emmanuel-delahaye.developpez....theque-clib-c/
    Module ITOA

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par jowo
    Mais j'ai remarqué que certaines fonctions standard comme printf, sprintf et autres ne fonctionnent que sous certaines modèles de mémoire.
    C'est tout à fait possible.

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Emcy
    c'est vrai que j'ai fait une erruer sur ce point mais j'ai toujours le meme message d'erreur...
    Quel message d'erreur ? Tu as parlé d'un warning...

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par JeitEmgie
    <...>
    OK pour moi :
    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
     
     
    /*
    	myiota:
    		converts an int in [0,4095] range into a 4 chars string left filled with 0
    		*outstr should points on a string buffer of at least 5 chars
    */
     
    void myitoa(unsigned short num,char *outstr)
    {
    #define BASE	(10)
    	int q, r ;
    	char *s = outstr + 3 ;
     
    	outstr[0] = '0' ;
    	outstr[1] = '0' ;
    	outstr[2] = '0' ;
    	outstr[3] = '?' ;
    	outstr[4] = '\0' ;
     
    	if (num > 4095)
    		return ;
     
    	do {
    		r = num % BASE ;
    		q = num / BASE ;
    		*s-- = r + '0' ;
     
    		num = q ;
    	}
    	while (num) ;
     
    #undef BASE
    }
     
    #ifdef TEST
    #include <stdio.h>
    #include <string.h>
     
    int main (void)
    {
       struct test
       {
          int n;
          int val;
          char const *s;
          int ret;
       };
     
       static const struct test a[]=
       {
          {10, 0, "0000", 0},
          {11, 4095, "4095", 0},
     
          {20, 4096, "000?", 0},
          {20, -1  , "000?", 0},
       };
     
       size_t i;
     
       #define N(a) (sizeof(a)/sizeof*(a))
       for (i=0; i < N(a); i++)
       {
          struct test const *p = a + i;
     
          char s[8] = "********";
     
          myitoa(p->val, s);
     
          if (strcmp (s, p->s) != 0)
          {
             printf  ("ERR at test %d\n", p->n);
             break;
          }
       }
     
       if (i == N(a))
       {
          puts ("P A S S E D");
       }
       return 0;
    }
     
    #endif
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    P A S S E D
     
    Press ENTER to continue.

  10. #30
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 249
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 249
    Par défaut
    merci pour votre aide active

    donc je vais prendre la solution de JeitEmgie

    On m'a dit que ça viendrait du compilo (certains compilo gère mal le standard : ça doit être mon cas)

    par contre ça sert à quoi de mettre de #define dans la fonction ? il n'existe pas un moyen plus effcace pour convertir un nombre binaire en nombre decimal ASCII ?

  11. #31
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Si, c'est une erreur de compréhension du langage C. C'est grave.
    D'accord, c'est mal comprendre ce qu'est un tableau; je voulais juste préciser que ce n'était pas une erreur dans ce cas et que la valeur était la même avec ou sans &. Cependant, je suis d'accord qu'il n'est pas logique d'écrire & devant un nom de tableau.
    a désigne un tableau de N éléments de type T. Il a pour valeur l'adresse du premier élément du tableau. Il a pour type T*.
    On est d'accord.
    &a est l'adresse du tableau. Il a certes la même valeur que a mais le type est différent : (T*)[N].
    &a a exactement la même valeur que a. Le type que vous lui donnez n'a aucun sens: (T *nom_type)[N] n'est pas valide.
    si jamais a est un pointeur, c'est le drame.
    D'accord, mais ici il s'agit de tableaux et j'ai juste voulu indiquer que ce n'était pas là qu'il fallait chercher l'erreur.
    Donc pas de &.
    Tout à fait d'accord. C'est illogique, mais ça ne génère pas d'erreur.

  12. #32
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par stephl
    &a a exactement la même valeur que a. Le type que vous lui donnez n'a aucun sens: (T *nom_type)[N] n'est pas valide.
    .
    Et pourtant Emmanuel a raison. Soit le tableau:
    ou t représente un type quelconque. La différence entre entre tableau et &tableau, c'est le type! tableau est une expression de type pointeur-sur-T, alors que &tableau est de type pointeur-sur-tableau-de-T i.e T (*)[]. La FAQ de comp.lang.c http://c-faq.com/aryptr/aryvsadr.html confirme cette information.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par stephl
    &a a exactement la même valeur que a. Le type que vous lui donnez n'a aucun sens: (T *nom_type)[N] n'est pas valide.
    EDIT : Exact, ce n'est pas du C. Ceci est valide :
    Tout à fait d'accord. C'est illogique, mais ça ne génère pas d'erreur.
    Mais ça génère un warning.
    http://emmanuel-delahaye.developpez....-codage-c/#LVI

  14. #34
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par mujigka
    Et pourtant Emmanuel a raison. Soit le tableau:
    ou t représente un type quelconque. La différence entre entre tableau et &tableau, c'est le type! tableau est une expression de type pointeur-sur-T,
    Faux, pointeur sur pointeur sur T, ou alors vous avez laissé trainer une '*' par inadvertance.
    alors que &tableau est de type pointeur-sur-tableau-de-T i.e T (*)[].
    D'accord si tableau est défini par T tableau[50]. D'ailleurs, vous avez corrigé l'erreur de vous-même, puisque vous avez écrit T (*)[], et non pas (T*)[N] comme Emmanuel, ce qui n'a aucun sens: (T *nom_type)[N] n'est pas valide.

  15. #35
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par stephl
    Faux, pointeur sur pointeur sur T, ou alors vous avez laissé trainer une '*' par inadvertance.
    Oups! Merci, faute d'inattention... J'ai édité mon post.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  16. #36
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Evidemment, ce n'est pas du C. Ceci est valide :
    Vous aviez écrit (T*)[N] ce qui se traduit normalement par (T *nom_type)[N] et n'est pas correct. Il faut écrire T (*)[N].

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par stephl
    Vous aviez écrit (T*)[N] ce qui se traduit normalement par (T *nom_type)[N] et n'est pas correct. Il faut écrire T (*)[N].
    Oué, déjà corrigé... faut suivre...

  18. #38
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Oué, déjà corrigé... faut suivre...
    Votre correction date de 10h29 tout comme mon message; vous admettrez donc que je n'ai pas pu voir votre correction à temps .

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par stephl
    Votre correction date de 10h29 tout comme mon message; vous admettrez donc que je n'ai pas pu voir votre correction à temps .
    http://www.developpez.net/forums/sho...3&postcount=33

    Dernière modification par Emmanuel Delahaye Aujourd'hui à 10h28.


  20. #40
    Membre émérite Avatar de stephl
    Profil pro
    Développeur informatique
    Inscrit en
    Février 2007
    Messages
    643
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2007
    Messages : 643
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    http://www.developpez.net/forums/sho...3&postcount=33

    Dernière modification par Emmanuel Delahaye Aujourd'hui à 10h28.
    Cela dépend de quelle correction vous parlez, car l'autre date de 10h29:
    http://www.developpez.net/forums/sho...1&postcount=25
    Et puis 1 minute d'écart, ça ne change pas grand chose. Il faut compter le temps d'actualisation du forum et mon temps d'actualisation personnel.

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

Discussions similaires

  1. Convertir un type String en Integer VB-A
    Par sebeni dans le forum Général VBA
    Réponses: 1
    Dernier message: 09/05/2007, 16h18
  2. [VBScript] Convertir date en string
    Par rabi dans le forum VBScript
    Réponses: 4
    Dernier message: 26/12/2005, 11h26
  3. [jar] convertir URL en String
    Par c-top dans le forum Entrée/Sortie
    Réponses: 3
    Dernier message: 22/11/2004, 11h19
  4. Integer ou string dans une DBGRID
    Par Yepazix dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/08/2004, 13h42
  5. Réponses: 6
    Dernier message: 14/02/2004, 14h01

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