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 :

pointeur à la fin "\0"


Sujet :

C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 41
    Points : 26
    Points
    26
    Par défaut pointeur à la fin "\0"
    j'ai une fonction qui demande un pointeur sur unsigned char mais il faut qu'il contient à la fin "\0" comment je peut faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    unsigned char *tmp; 
    fonction(tmp);
    mais je ne peut pas l'afficher avec printf car n'y a pas \0 à la fin
    Comment je peut le faire?

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Salut,

    C'est '\0' et non "\0"...

    La différence est subtile:

    '\0' représente le caractère nul (dont la valeur numérique est 0, car un char, ce n'est qu'une succession de bits que l'on peut représenter comme une valeur numérique )

    "\0" représente (c'est pas tout à fait juste, mais bon) une chaine de caractères composée du caractère '\' et du caractère '0'.

    Ceci dit:
    printf est une fonction C, et il est préférable d'éviter les fonctions issues du C en faveur des possibilités propres au C++, car elles sont plus sécurisantes et souvent plus faciles à l'emploi.

    Ainsi, il serait préférable d'utiliser la classe string, disponible dans l'espace de noms std par inclusion du fichier d'en-tête <string> pour la représentation des chaines de caractères plutôt qu'un pointeur sur char, et d'utiliser cout pour l'affichage.

    Si, tu as vraiment besoin de passer un char* à une fonction, parce que la fonction fait partie d'un programme ou d'une bibliothèque écrite en C, par exemple, tu pourra récupérer la chaine "C style" à l'aide de la fonction membre c_str()
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    Salut,

    j'utilise une fonction d'une biblioth"que réaliser en c elle demande comme paramétre un pointeur sur unsigned char j'ai mis ce portion de code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    unsigned char *tmp;
    tmp=new unsigned char[10];//pour obtenir '\0' à la fin
    res=tmp_list.GetTemplate(0,typ_tmp,lg_tmp,tmp);
    //tmp est une valeur retourner par cette fonction 
    printf(" temp :%s\n",*tmp);
    // avec cette printf j'ai une erreue d'execution

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 612
    Points
    30 612
    Par défaut
    Comme je te l'ai dit, il est préférable d'utiliser la classe string:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <string>
    /*la fonction C que tu utilise  */
    void foo(const char *);
    int main()
    {
        std::string str; /* En C++, on préfère la classe string */
        str="salut";
        str+=" le monde"; // plus facile comme ca, non ?
        foo(str.c_str());
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Comme je te l'ai dit, il est préférable d'utiliser la classe string:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #include <string>
    /*la fonction C que tu utilise  */
    void foo(const char *);
    int main()
    {
        std::string str; /* En C++, on préfère la classe string */
        str="salut";
        str+=" le monde"; // plus facile comme ca, non ?
        foo(str.c_str());
    }
    le problème est que apparemment foo prendrai plutôt un unsigned char non constant car il le modifie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tmp=new unsigned char[10];//pour obtenir '\0' à la fin
    je ne suis pas certains que tmp[9] soit égal a '\0' tu peux rajouter
    pour être sûr.

    _________________________EDIT_______________________

    je viens de voir
    Citation Envoyé par info21 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf(" temp :%s\n",*tmp);
    sa serai pas plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf(" temp :%s\n",tmp);
    ton erreur d'execution viens peut être de là

  6. #6
    Nouveau membre du Club
    Inscrit en
    Octobre 2008
    Messages
    41
    Détails du profil
    Informations forums :
    Inscription : Octobre 2008
    Messages : 41
    Points : 26
    Points
    26
    Par défaut
    Salut,

    Mon probléme ce que j'utilise des bibliothéque qui ne sont pas la mienne et qui impose des types de retour comme vous l'avez vu
    voila j'utilise une fonction qui demande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    un pointeur sur unsigned char
    j'ai utilisé ce portion de code et ça marche car il demande qu'il se termine par '\0'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    unsigned char ch2[]="salah";
    res=c_fld.PutField(1,sizeof(ch2),ch2)
    ça marché mais le probléme :
    ---- j'utilise une fonction qui demande une adresse sur pointeur sur unsigned char si je ne me trompe pas voila ce que demande en message d'erreur si je ne met pas le type voulu
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    impossible de convertir le paramètre 4 de 'unsigned char [50]' en 'unsigned char *&'
    //le type voulu c'est unsigned char *&
    voila l'exemple liée a l'erreur citer dessus
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    unsigned char reg[50];
    res=tmp_list.GetTemplate(0,typ_tmp,lg_tmp,reg);
    Merci de me préciser c'est quoi le type demander
    Merci pour votre aide

  7. #7
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    pourrais tu nous donner la signature exacte de tmp_list.GetTemplate

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par atttchoum Voir le message
    pourrais tu nous donner la signature exacte de tmp_list.GetTemplate
    Et ce qu'elle est supposée faire avec ses arguments...

  9. #9
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Points : 704
    Points
    704
    Par défaut
    [TROLL (d'un puriste du C)]
    Citation Envoyé par koala01 Voir le message
    "\0" représente (c'est pas tout à fait juste, mais bon) une chaine de caractères composée du caractère '\' et du caractère '0'.
    Oui, même pas du tout...
    En C (ou C++ d'ailleurs) "\0" n'est pas une chaine de deux caractères ! "\0" est une chaîne de caractère non nulle mais de longueur 0...
    car '\0' est le caractère spécial qui marque la fin d'une chaine de caractère.
    D'autre part la chaine "\n" ne contient pas deux caractères '\' et 'n' mais un seul '\n', en c le caractère \ est '\\'...
    [/TROLL]

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    188
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 188
    Points : 248
    Points
    248
    Par défaut
    Citation Envoyé par Fabllot Voir le message
    [TROLL (d'un puriste du C)]

    Oui, même pas du tout...
    En C (ou C++ d'ailleurs) "\0" n'est pas une chaine de deux caractères ! "\0" est une chaîne de caractère non nulle mais de longueur 0...
    car '\0' est le caractère spécial qui marque la fin d'une chaine de caractère.
    D'autre part la chaine "\n" ne contient pas deux caractères '\' et 'n' mais un seul '\n', en c le caractère \ est '\\'...
    [/TROLL]
    +1

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