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 printf d'un chaîne de caractère


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Consultant
    Inscrit en
    Mars 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant

    Informations forums :
    Inscription : Mars 2007
    Messages : 59
    Par défaut problème de printf d'un chaîne de caractère
    Bonjour,

    Je souhaite afficher une chaine de caractère mais j'ai une instruction "printf" qui ne me retourne pas la valeur attendue.
    Mon printf est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
       printf("ErrMsg %s\n",Output->ErrMsg)
    le résultat à l'écran est :
    MD06 0901Z


    Mais ce n'est pas le résultat attendu.

    J'ai vérifié avec le débugger "gdb" le contenu de la variable "Output->ErrMsg"
    J'obtiens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    (gdb) p Output->ErrMsg
    $2 = "/$", ' ' <repeats 24 times>, "INTRODUCTION TO HELP  EN  28NOV06 0901Z\r \r THESE ARE THE WAYS YOU CAN FIND THE HELP YOU NEED:\r \r TYPE OF HELP", ' ' <repeats 17 times>, "ENTRY", ' ' <repeats 19 times>, "EXAMPLE\r ", '-' <repeats 12 times>, ' ' <repeats 17 times>, "-----", ' ' <repeats 19 times>, "-------\r S"...

    Qq'un aurait-il eu un problème similaire ?

    Merci

  2. #2
    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 : 47
    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
    A quoi correspond Output, comment la structure est-elle initialisée et comment la chaîne est-elle créée dans ErrMsg ?
    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 !

  3. #3
    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
    Chez moi, le programme suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <stdio.h>
     
    int main(void)
    {
        printf("XXXXXXXXXX\r000");
        fflush(stdout);
     
        return 0;
    }
    affiche:
    Qu'est-ce que tu en conclus? Le caractère '\r' n'est pas un caractère de fin de ligne, mais un retour charriot. Le problème est probablement que, comme dans le code ci-dessus, le retour charriot entraine un écrasement de certains caractères par ce qui vient après.

    Au passage, printf() n'est pas une instruction, mais une fonction. Elle retourne bien une valeur, mais pas celle que tu penses (l'affichage sur stdout est un effet de bord).

    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++

    +

  4. #4
    Membre confirmé
    Profil pro
    Consultant
    Inscrit en
    Mars 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant

    Informations forums :
    Inscription : Mars 2007
    Messages : 59
    Par défaut
    le champ Output->Errcode est une chaine de caractère.
    sa définition est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct Hsfres
    {
       [...]
       char ErrMsg[71]; 
    };

  5. #5
    Membre confirmé
    Profil pro
    Consultant
    Inscrit en
    Mars 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant

    Informations forums :
    Inscription : Mars 2007
    Messages : 59
    Par défaut
    La variable "Output->ErrMsg" est initialiser via la fonction strncpy :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    strncpy( Output->ErrMsg, ns13->generalErrorInfo->messageErrorText.text[0], ERRMSG_SIZE );
    Où:
    ns13->generalErrorInfo->messageErrorText.text[0] est une structure C d'une Réponse XML.
    Cette structure C est remplit par un Webservice.

    Avec text[0] déclaré comme :
    char **text

  6. #6
    Membre confirmé
    Profil pro
    Consultant
    Inscrit en
    Mars 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant

    Informations forums :
    Inscription : Mars 2007
    Messages : 59
    Par défaut
    Merci Thierry pour ta réponse.

    Je n'avais pas pensé à la possibilité qu'il y ait un '\r' dans le message.
    Je vais vérifier dans ma réponse XML que je n'ai pas de retour chariot.

  7. #7
    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 beb1982 Voir le message
    La variable "Output->ErrMsg" est initialiser via la fonction strncpy :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    strncpy( Output->ErrMsg, ns13->generalErrorInfo->messageErrorText.text[0], ERRMSG_SIZE );
    Le problème de strncpy(), c'est qu'en cas de saturation, le 0 n'est pas mis et la chaine est invalide. Le comportement est indéterminé (Tu pourrais très bien tomber sur un '\r' après, par hasard...)

  8. #8
    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 beb1982 Voir le message
    Merci Thierry pour ta réponse.

    Je n'avais pas pensé à la possibilité qu'il y est un '\r' dans le message.
    Je vais vérifier dans ma réponse XML que je n'ai pas de retour chariot.
    Avec ce qu'on voit dans la session gdb que tu as postée, il y a des retours chariot:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    "INTRODUCTION TO HELP  EN  28NOV06 0901Z\r"
    Ici, on voit une partie de la chaine qui s'affiche effectivement, suivie d'un retourn chariot.

    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++

    +

  9. #9
    Membre confirmé
    Profil pro
    Consultant
    Inscrit en
    Mars 2007
    Messages
    59
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant

    Informations forums :
    Inscription : Mars 2007
    Messages : 59
    Par défaut
    Merci à tous pour votre aide. Le problème vient bien du '\r'.

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/11/2014, 12h55
  2. Problème d'affichage d'une chaîne de caractères
    Par bob32 dans le forum Assembleur
    Réponses: 13
    Dernier message: 23/06/2008, 22h06
  3. Problème sur des chaînes de caractères
    Par Anonymous dans le forum Access
    Réponses: 9
    Dernier message: 16/09/2005, 08h21
  4. Problème pour exécuter une chaîne de caractères
    Par Pongo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/09/2005, 10h34
  5. Problème de chaîne de caractères (BSTR)
    Par patvdb dans le forum MFC
    Réponses: 2
    Dernier message: 26/02/2004, 15h44

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