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 :

problème de conversion et concaténation des chaines de caractères


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2015
    Messages : 75
    Par défaut problème de conversion et concaténation des chaines de caractères
    Bonjour tout le monde,

    J'ai besoin de vos aides SVP.

    Je suis entrain de créer un programme qui reçoit ne entrée un nombre hexadécimal. Le but du programme est de vérifier si ce nombre est écrit sur 8 octets. Sinon il ajoute les zéros manquants au début.

    Par exemple: de : AFF12 je veux obtenir 000AFF12.

    J'ai commencé par convertir mon nombre en chaine pour déterminer le nombre de caractère et savoir combien de 0 je dois ajouter, et concaténer ensuite cette suite de 0 à la chaine de base.
    J'ai crée ce programme mais il plante donc surement il y a une erreur que je n'arrive pas à trouver.

    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
     
     
    #include <stdio.h>
    #include<stdlib.h>
    #include<string.h>
     
    int main()
    {
        int c;
        char *chaine[10] ;
        int c_res;
        unsigned int c_long;
        char *chaine_zero;
        char *chaine_res;
        printf("donner le nombre: \n");
        scanf("%x", &c); 
     
        itoa(c,chaine,16);
        printf("la chaine obtenu est : %s \n", chaine);
     
        c_long=strlen(chaine);
        printf("la longeur est : %d \n", c_long);
     
     
        if(c_long==8)
        {
            c_res=c;
            printf("le  nombre = %x \n", c_res);
     
        }
         else
         {
             unsigned int nbre_zero=(8-c_long);
             printf("nbre_zero= %d \n", nbre_zero);
             switch(nbre_zero)
             {
                 case 1:
                     chaine_zero="0";
                     break;
                 case 2:
                     chaine_zero="00";
                     break;
                 case 3:
                     chaine_zero="000";
                     break;
                 case 4:
                     chaine_zero="0000";
                     break;
                case 5:
                    chaine_zero="00000";
                    break;
                case 6:
                    chaine_zero="000000";
                    break;
                case 7:
                    chaine_zero="0000000";
                    break;
         }
         printf("chaine_zero= %s \n", chaine_zero);
         concat(chaine_zero, nbre_zero, chaine, c_long,chaine_res);
         printf("chaine_res= %s \n", chaine_res);
         c_res=atoi(chaine_res);
         printf("le  nombre = %x \n", c_res);
         }
         return 0;
         }
     
     
       void concat(char * str1, unsigned int nbc1, char * str2, unsigned int nbc2,char * rstr)
    {
        unsigned int i = 0;
        rstr = (char*)malloc((nbc1+nbc2+1) * sizeof(char));
        for(i = 0; i < nbc1; i++)
            {
                rstr[i]=str1[i];
     
            }
     
     
        for(i = 0; i < nbc2; i++)
            {
                rstr[i+nbc1]=str2[i];
     
            }
     
     
        rstr[nbc1+nbc2+1]='\0';
     
    }
    Quelqu'un pourra m'aider SVP .
    Merci

  2. #2
    Membre Expert

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Par défaut
    Quel est le but de cette "conversion" ? C'est juste pour faire de l'affichage ?
    Si c'est le cas, printf fait ça très bien tout seul:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    printf("%08x", 1);
    --> 00000001

  3. #3
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2015
    Messages : 75
    Par défaut
    Citation Envoyé par nnovic Voir le message
    Quel est le but de cette "conversion" ? C'est juste pour faire de l'affichage ?
    Si c'est le cas, printf fait ça très bien tout seul:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    printf("%08x", 1);
    --> 00000001
    Non je cherche à récupérer ce nombre par la suite pour le traiter. En fait, j'ai besoin qu'il soit sur 8octets car je vais extraire la partie LSB et MSB par le travail qui suit.

    Merci

  4. #4
    Membre Expert

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Par défaut
    Citation Envoyé par abyass Voir le message
    Non je cherche à récupérer ce nombre par la suite pour le traiter. En fait, j'ai besoin qu'il soit sur 8octets car je vais extraire la partie LSB et MSB par le travail qui suit.

    Merci
    Mais tu vas travailler sur des valeurs numériques ou sur des chaines de caractères ? Je pige pas, là !

  5. #5
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Mars 2015
    Messages
    75
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 33
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Mars 2015
    Messages : 75
    Par défaut
    Citation Envoyé par nnovic Voir le message
    Mais tu vas travailler sur des valeurs numériques ou sur des chaines de caractères ? Je pige pas, là !
    effectivement je travaille avec valeurs numériques donc je dois convertir les chaines en entiers par la suite. Et c'est mon problème déjà là. Quand j'applique atoi le résultat revient sans les 0 ajoutés.
    Merci

  6. #6
    Membre Expert

    Homme Profil pro
    Responsable des études
    Inscrit en
    Mars 2009
    Messages
    553
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Industrie

    Informations forums :
    Inscription : Mars 2009
    Messages : 553
    Par défaut
    Dans ce cas il ne faut surtout pas chercher à passer par des chaines de caractères. Ton entier est dans la variable 'c', qui est de type int. Un simple jeu de masques et de décalages de bits te permettront d'isoler la partie 'haute' de la partie 'basse'. Les fameux zéros que tu veux ajouter sont une simple convention d'affichage, ça n'apporte rien à ton programme.

  7. #7
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Et si tu utilisais les nombreuses options de configuration des fonctions *printf?

    Effectivement printf("%x", nombre) affiche le nombre brut en hexadécimal, mais en rajoutant les bonnes options entre le % et le x, tu peux obtenir ce que tu veux.
    Regarde une documentation officielle.

  8. #8
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    réponse rapide en une ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    char* buffer = malloc(8+1);
    sprintf( buffer , "%08X" , c ); // pour l'avoir dans une variable
    printf( "le  nombre = %s\n" , buffer );
    .

    Sinon dans ta version (un peu plus longue), ligne 87 il faut plutôt faire rstr[nbc1+nbc2]='\0';, et ne pas oublier de libérer la mémoire qui a été allouée au moment du concat.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 30/01/2013, 20h15
  2. Réponses: 1
    Dernier message: 10/01/2008, 10h10
  3. Problème sur des chaines de caractères
    Par soso78 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 16/10/2007, 13h11
  4. Problème dans des "IF" avec des chaines de caractères
    Par lanysteph dans le forum Langage
    Réponses: 4
    Dernier message: 16/11/2006, 11h37
  5. Problème de syntaxe pour concaténer des variables
    Par renaud26 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 05/09/2006, 09h44

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