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 de plusieurs entiers vers chaine de caractères [Débutant(e)]


Sujet :

C

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 35
    Points : 11
    Points
    11
    Par défaut Conversion de plusieurs entiers vers chaine de caractères
    Bonjour,
    Je souhaiterai convertir plusieurs entiers et les mettre les uns à la suite des autres dans une chaine de caractère mais le problème c'est que ca prend beaucoup de ligne avec des itoa et des strcat.

    Est-ce qu'il y a moyen de faire comme pour printf ?

    Car je voudrai stocker le résultat de ce printf dans une chaine de caractère :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("T%dmin : %02X%02X%02X\n", i/2 , hash.B[0], hash.B[1], hash.B[2]);
    Merci

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 13
    Points
    13
    Par défaut
    Il suffit d'utiliser sprintf: même fonctionnement que printf, sauf que la sortie s'effectue dans une chaîne de caractères passée en premier argument:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sprintf(str, "T%dmin : %02X%02X%02X\n", i/2 , hash.B[0], hash.B[1], hash.B[2]);
    Fais juste attention au buffer overflow: il faut que ta chaîne de caractères soit suffisamment grande.

  3. #3
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    Merci ca marche,
    Par contre est-ce qu'on peut utilise un pointeur a un char au lieu d'un tableau de caractère avec cette fonction ?

    i contient le nombre de seconde depuis 1970 et j'aimerai le convertir en date + heure, est-ce qu'il y a moyen svp ?

    j'ai essayer avec ctime mais ca bug avec les histoires de pointeurs.

  4. #4
    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 azertylr
    Par contre est-ce qu'on peut utilise un pointeur a un char au lieu d'un tableau de caractère avec cette fonction ?
    Si le pointeur est correctement initialisé, oui. Si il pointe n'importe où ou sur quelque chose de non modifiable, ça ne fonctionnera pas, évidemment... Tu peux utiliser "%s"...
    i contient le nombre de seconde depuis 1970 et j'aimerai le convertir en date + heure, est-ce qu'il y a moyen svp ?
    struct tm
    localtime() (heure locale)
    gmtime() (heure GMT)
    strftime()

    Bien lire la doc, c'est très puissant.
    Pas de Wi-Fi à la maison : CPL

  5. #5
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char *ligne="\0";
    sprintf(ligne, "%02X%02X%02X : %s", hash.B[0], hash.B[1], hash.B[2], Convert_heure(t_debut + i));
    Ne marche pas.

    Pour convertir l'heure j'ai fait une bidouille qui marche mais ca ne me plait pas trop.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char * Convert_heure(signed long i)
    {
        time_t heure = ((i/2)+8415360)*60;
        ctime(&heure);
    }
     
    //Et ensuite j'utilise : 
     
        char ligne[30];
    sprintf(ligne,"%s", Convert_heure(i));

  6. #6
    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 azertylr
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char *ligne="\0";
    sprintf(ligne, "%02X%02X%02X : %s", hash.B[0], hash.B[1], hash.B[2], Convert_heure(t_debut + i));
    Ne marche pas.
    Bah oui. Quels sont les mots que tu ne comprends pas dans

    "Fais juste attention au buffer overflow: il faut que ta chaîne de caractères soit suffisamment grande."

    D'autre part une chaine n'est pas modifiable. Il faut utiliser un tableau de char suffisamment grand :

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    char ligne[128];
    sprintf (ligne, "%02X%02X%02X : %s", hash.B[0], hash.B[1], hash.B[2],
    Pour convertir l'heure j'ai fait une bidouille qui marche mais ca ne me plait pas trop.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char * Convert_heure(signed long i)
    {
        time_t heure = ((i/2)+8415360)*60;
        ctime(&heure);
    }
     
    //Et ensuite j'utilise : 
     
        char ligne[30];
    sprintf(ligne,"%s", Convert_heure(i));
    Purée, ça sert à quoi que je t'indique les pistes si tu ne les suis pas. Rappel :

    struct tm
    localtime() (heure locale)
    gmtime() (heure GMT)
    strftime()

    Bien lire la doc, c'est très puissant.

    et j'ajoute parce que tu ne m'as pas l'air très dégourdi...

    http://man.developpez.com/
    Pas de Wi-Fi à la maison : CPL

  7. #7
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Bah oui. Quels sont les mots que tu ne comprends pas dans

    "Fais juste attention au buffer overflow: il faut que ta chaîne de caractères soit suffisamment grande."
    C'est pour ca que je demandais
    Citation Envoyé par azertylr
    Par contre est-ce qu'on peut utilise un pointeur a un char au lieu d'un tableau de caractère avec cette fonction ?
    Purée, ça sert à quoi que je t'indique les pistes si tu ne les suis pas. Rappel :

    struct tm
    localtime() (heure locale)
    gmtime() (heure GMT)
    strftime()
    Je n'ai pas essayer localtime et gmtime car ca renvoit "une représentation struct tm exprimée en fonction du fuseau horaire de l'utilisateur."
    J'ai essayer ctime et ca marche mais de la manière dont je l'ai fait c'est moche.

    Je vais voir strftime.

    Merci pour le manuel en francais des fonctions.

    Je trouve dommage qu'en C il y a beaucoup de fonction (comme strcat, strftime ...) où l'on ne peut pas faire machin=strftime (blabla)

  8. #8
    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 : 45
    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 azertylr
    Pour convertir l'heure j'ai fait une bidouille qui marche mais ca ne me plait pas trop.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    char * Convert_heure(signed long i)
    {
        time_t heure = ((i/2)+8415360)*60;
        ctime(&heure);
    }
     
    //Et ensuite j'utilise : 
     
        char ligne[30];
    sprintf(ligne,"%s", Convert_heure(i));
    En plus de ce que t'ont dit mes deux estimables collègues, j'ai comme l'impression qu'il manque un "return" quelque part ici, tu ne trouves pas ?
    Le C n'est pas magique. Il ne suffit pas, en général, d'aligner des fonctions pour que ça tombe en marche.

    Pour t'en apercevoir rapidement, n'hésites pas à bien paramétrer ton compilateur...
    [alkama] quelqu'un est allé voir la guerre des mondes?
    [@Chrisman] j'espère pour spielberg
    --- bashfr.org

  9. #9
    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 : 45
    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 azertylr
    Je trouve dommage qu'en C il y a beaucoup de fonction (comme strcat, strftime ...) où l'on ne peut pas faire machin=strftime (blabla)
    Ca a un intérêt certain (enfin, quand on s'intéresse un tant soit peu au traitement des erreurs): on peut s'assurer que la fonction s'est terminée correctement.
    Sinon, ça ne fait que rajouter une étape dans le code (ce qui permet de rajouter des commentaires ) et faciliter le débuggage.
    [alkama] quelqu'un est allé voir la guerre des mondes?
    [@Chrisman] j'espère pour spielberg
    --- bashfr.org

  10. #10
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par zooro
    Ca a un intérêt certain (enfin, quand on s'intéresse un tant soit peu au traitement des erreurs): on peut s'assurer que la fonction s'est terminée correctement.
    Sinon, ça ne fait que rajouter une étape dans le code (ce qui permet de rajouter des commentaires ) et faciliter le débuggage.
    Ok merci de cette explication. C'est que en delphi j'ai l'habitude de "imbriquer" les fonctions, ce qui n'est pas très lisible c'est sur !

  11. #11
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par zooro
    En plus de ce que t'ont dit mes deux estimables collègues, j'ai comme l'impression qu'il manque un "return" quelque part ici, tu ne trouves pas ?
    Le C n'est pas magique. Il ne suffit pas, en général, d'aligner des fonctions pour que ça tombe en marche.

    Pour t'en apercevoir rapidement, n'hésites pas à bien paramétrer ton compilateur...

    Effectivement lorsqu'on paramètre le compilateur il y a beaucoup de warning !

  12. #12
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    J'ai essayé strftime mais ca bug :'(

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    char date[30];
    struct tm *tmp;
     
    //i est un long int
    tmp = localtime(((i/2)+8415360)*60);
     
    strftime(date,sizeof(date),"%m",tmp);

  13. #13
    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 azertylr
    J'ai essayé strftime mais ca bug :'(
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    //i est un long int
    tmp = localtime(((i/2)+8415360)*60);
    <...>
    Bah oui, faut lire la doc. localtime() attend l'adresse d'un time_t et pas n'importe quoi...

    La conversion peut échouer...
    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
     
    #include <stdio.h>
    #include <time.h>
     
    int main (void)
    {
       char date[30];
       struct tm *tmp;
       long int i = 12345;
       time_t t = ((i / 2) + 8415360) * 60;
     
       tmp = localtime (&t);
     
       if (tmp != NULL)
       {
          strftime (date, sizeof (date), "%m", tmp);
       }
       else
       {
          perror ("localtime");
       }
     
       return 0;
    }
    Pas de Wi-Fi à la maison : CPL

  14. #14
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    Merci c'est tout bon, le seul problème c'est que pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strftime (date, sizeof (date), "%A %c", tmp);
    il affiche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thursday 08/16/07 11:38:00
    soit en date américaine alors que le format de l'heure de mon PC est francais. Est-ce que l'on peut modifier les options de localisation du programme ?

    Merci.

  15. #15
    Membre à l'essai
    Inscrit en
    Mars 2003
    Messages
    35
    Détails du profil
    Informations forums :
    Inscription : Mars 2003
    Messages : 35
    Points : 11
    Points
    11
    Par défaut
    Apparament c'est setlocale(LC_TIME,"Fr");

  16. #16
    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 azertylr
    le seul problème c'est que pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    strftime (date, sizeof (date), "%A %c", tmp);
    il affiche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thursday 08/16/07 11:38:00
    soit en date américaine alors que le format de l'heure de mon PC est francais.
    Tu as lu la doc de strftime() ? Tu peux quasiment tout contrôler...
    Est-ce que l'on peut modifier les options de localisation du programme ?
    Oui, avec setlocale().
    Pas de Wi-Fi à la maison : CPL

Discussions similaires

  1. Caster un nombre de entier vers chaine de caractère
    Par ghir_ana dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 28/11/2011, 03h39
  2. Conversion entier vers chaine formatée
    Par mikaelm dans le forum Ruby
    Réponses: 2
    Dernier message: 19/06/2008, 13h43
  3. conversion entier vers chaine de caratères
    Par naima2005 dans le forum C++
    Réponses: 3
    Dernier message: 20/08/2006, 02h14
  4. Réponses: 5
    Dernier message: 15/11/2005, 12h57
  5. Entier vers chaine
    Par litbos dans le forum C
    Réponses: 6
    Dernier message: 28/10/2005, 14h58

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