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 :

Perte de la valeur d'une chaîne


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Par défaut Perte de la valeur d'une chaîne
    Bonjour,
    j'ai écrit une pe tite fonction qui ne devrait pas poser de problème
    mais au cours de la fonction je perds la valeur de ma chaîne et je ne comprends pas pourquoi.
    Voici cette fonction :

    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
     
    void preparerEnregistrement (gchar *enregistrement2, gchar *activite, gchar * numero2,
                                long enreg,long act,long num)
    {
       gchar enregistrement[5]={0},numero[5]={0};
       long i=0;
     
        sprintf(enregistrement, "%d", enreg);
        sprintf(activite, "%d", act);
        sprintf(numero, "%d", num);
     
        for (i=0;i<5-strlen(enregistrement);i++)
        {
         enregistrement2[i]=32;
         }
        strcat(enregistrement2,enregistrement);
        printf("enregistrement: %s",enregistrement2);//On obtient "    0"
     
        for (i=0;i<5-strlen(numero);i++)
        {
         numero2[i]=32;
         }
        strcat(numero2,numero);
        printf("enregistrement: %s",enregistrement2); //on obtient ""
    }
    J'ai placé deux printf pour tester la chaîne. Le premier renvoie la bonne valeur, le deuxième non. Qui pourrait me dire pourquoi ?


    Merci pour votre aide

  2. #2
    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
    gchar, est-ce pareil que char? Pourriez-vous montrer votre appel à la fonction preparerEnregistrement(), notamment les paramètres passés? Si votre but est simplement d'afficher des entiers dans des champs de largeur fixe, ceci suffit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void preparerEnregistrement (gchar *enregistrement2, gchar *activite, gchar * numero2,
                                long enreg,long act,long num)
    {
        sprintf(enregistrement2, "%-5ld", enreg);
        sprintf(numero2,"%-5ld",num);
        sprintf(activite,"%-5ld",act);
        printf("enregistrement: %s",enregistrement2);
        printf("numero: %s",numero2);
        printf("activite: %s",activite);
    }
    Attention cependant, ce code suppose que les buffers passés sont au moins de taille 6 et que les entiers enreg, act et num ne comportent pas plus de 5 chiffres sans signe ou 4 chiffres avec signe.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    12
    Détails du profil
    Informations personnelles :
    Âge : 50
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 12
    Par défaut
    Je n'arrive pas à imaginer ce que la fonction est sensée faire.

    En tout cas, si les paramètres passés sont valides, il n'y a pas de raisons pour que les printf n'affichent pas la même chose vu qu'ils sont identiques et que rien ne modifie enregistrement2 entre les 2.

  4. #4
    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 : 48
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par stephl
    gchar, est-ce pareil que char?
    Oui, c'est juste un typedef:
    Ca fait partie de la GLIB
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  5. #5
    Membre confirmé Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Par défaut
    Citation Envoyé par stephl
    gchar, est-ce pareil que char? Pourriez-vous montrer votre appel à la fonction preparerEnregistrement(), notamment les paramètres passés? Si votre but est simplement d'afficher des entiers dans des champs de largeur fixe, ceci suffit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    void preparerEnregistrement (gchar *enregistrement2, gchar *activite, gchar * numero2,
                                long enreg,long act,long num)
    {
        sprintf(enregistrement2, "%-5ld", enreg);
        sprintf(numero2,"%-5ld",num);
        sprintf(activite,"%-5ld",act);
        printf("enregistrement: %s",enregistrement2);
        printf("numero: %s",numero2);
        printf("activite: %s",activite);
    }
    Attention cependant, ce code suppose que les buffers passés sont au moins de taille 6 et que les entiers enreg, act et num ne comportent pas plus de 5 chiffres sans signe ou 4 chiffres avec signe.
    Voici l'appel de fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        gchar enregistrement[5]={0},activite[1]={0}, numero[5]={0};
        preparerEnregistrement (enregistrement, activite, numero,0,1,1);

    J'ai utilisé printf uniquement pour tester la fonction, je ne veux rien afficher. Cette fonction serre seulement à préparer les repères que je vais intégrer à une chaîne qui va elle même être enregistrée dans un fichier.
    Et vraiment c'est la 4eme dimension je ne comprends pas ce qui se passe entre les deux appels de printf.
    Croyez-vous aux trous noirs en informatique? En tout cas c'est troublant !

    Edité : J'ai d'autres éléments. Si je modifie légèrement les deux lignes de test comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    printf("premier passage :%s**\n",enregistrement2);
    //.....//
    printf("deuxième passage :%s**",enregistrement2);
    Dans ma console j'obtiens :
    premier passage : 0**
    deuxième passage :**
    Donc la chaîne se vide entre les deux appels de printf

    En revanche si je déclare les variables en static dans le code d'apel comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    static gchar enregistrement[5]={0},activite[1]={0}, numero[5]={0};
    alors c'est activite qui disparaît et plus enregistrement2 Et si je teste "activite" j'obtiens:
    premier passage :1 0**
    deuxième passage :**
    je patauge ... ça devrait être simple !

  6. #6
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    il me semble (faudrais que je prenne un bout de papier ... a cette heure la avant mon petit dej j'ai un peu de mal) que ton deuxieme strcat ecrit au dela des limites de ton tableau numero2
    ce qui veux dire qu'on viens ecrire sur ce qui viens apres dans le stack ... soit activite et enregistrement2 ... (si t'es bien sur du x86)

    verifife en remplaçant strcat par un strncat, si numero2 est tronqué, bingo

  7. #7
    Membre confirmé Avatar de acryline
    Profil pro
    Inscrit en
    Août 2006
    Messages
    200
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 200
    Par défaut
    si j'augmente la taille de mes tableaux ça marche
    Désolée pour le dérangement et merci !

  8. #8
    Membre éprouvé
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Par défaut
    il faut alors etre SUR et CERTAIN (algorithmiquement parlant) de ne jamais depasser les tailles de tes tableaux ... sinon tu ne resoud rien, tu masque le probleme ... et un jour ta fonction vas te peter a la gueule ... ou (pire?) alors tu vas re-utiliser la fonction avec du code reseau, et tu vas te faire pirater ...

    strncat c'est pas si compliqué que ça a utiliser (ou a recoder si on l'as pas ).

Discussions similaires

  1. Réponses: 7
    Dernier message: 03/02/2012, 17h15
  2. Recherche de valeurs dans une chaîne de caractères
    Par julieng31 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 18/08/2009, 15h43
  3. Réponses: 2
    Dernier message: 19/04/2007, 15h26
  4. comment vérifier la présence d'une valeur ds une chaîne ?
    Par lidouka dans le forum Langage SQL
    Réponses: 4
    Dernier message: 12/03/2006, 07h01
  5. Réponses: 17
    Dernier message: 03/10/2005, 11h16

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