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 :

Taille de chaines de caractere et \0


Sujet :

C

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut Taille de chaines de caractere et \0
    Salut a tous,
    Un petit probleme dont je ne connais pas a l'heure d'aujourd'hui la solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <stdio.h>
    #include <string.h>
    main()
    {
      char tocrypt[]="Voila";
      printf("Taille:[%u]\n",strlen(tocrypt));
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    E:\home\test>gcc test.c
     
    E:\home\test>a.exe
    Taille:[5]
     
    E:\home\test>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    #include <stdio.h>
    #include <string.h>
    main()
    {
      char tocrypt[]="Vo\0ila";
      printf("Taille:[%u]\n",strlen(tocrypt));
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
     
    E:\home\test>gcc test.c
     
    E:\home\test>a.exe
    Taille:[2]
     
    E:\home\test>
    Comment obtenir la taille=5, autrement dit existe-t-il une fonction permettant de connaitre la taille réelle (délimiteur \0 ignoré...) ??
    En fait il est possible que je manipule des données binaires et le \0 peut etre un caractere possible !!
    MErci d'avance pour les réponses!
    A bientot

  2. #2
    Membre émérite
    Avatar de la drogue c'est mal
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    2 253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 2 253
    Points : 2 747
    Points
    2 747
    Par défaut
    strlen permet de connaitre la longueur d'une chaine caractere donc ca se sert qu'a des chaines caracteres. Sinon utilise sizeof pour la taille des tableaux static

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par la drogue c'est mal
    strlen permet de connaitre la longueur d'une chaine caractere donc ca se sert qu'a des chaines caracteres. Sinon utilise sizeof pour la taille des tableaux static
    BINGO !!
    Merci!

  4. #4
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Une chaine de caractere est terminée par NULL en C et n'est censé contenir que des caractères ASCII imprimables.
    Dans ton cas tu utilises un buffer (d'unsigned char tant qu'a faire) et tu stocks sa taille a cote.

  5. #5
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Mefiance avec sizeof ... si tu passes ton buffer à une fonction crypt, sizeof va te reserver uen mauvaise surprise.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par HW
    Mefiance avec sizeof ... si tu passes ton buffer à une fonction crypt, sizeof va te reserver uen mauvaise surprise.
    Comment ca ?
    Moi j'ai besoin de savoir la taille en octets de la chaine .

  7. #7
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    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
     
    void crypt( const char * Buffer )
    {
        int size = sizeof( Buffer ); /* Surprise !!! */
        (...)
    }
     
    int main()
    {
        unsigned char tocrypt[] = "Voila";
        crypt( tocrypt );
     
        unsigned char * buff = malloc( 10 );
        int size = sizeof( buff ); /* Surprise !!! */
        delete( buff );
     
        return 0;
    }

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par HW
    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
     
    void crypt( const char * Buffer )
    {
        int size = sizeof( Buffer ); /* Surprise !!! */
        (...)
    }
     
    int main()
    {
        unsigned char tocrypt[] = "Voila";
        crypt( tocrypt );
     
        unsigned char * buff = malloc( 10 );
        int size = sizeof( buff ); /* Surprise !!! */
        delete( buff );
     
        return 0;
    }
    Excuse moi mais qu'y a t-il dans le Kinder ?

  9. #9
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par KORTA
    Comment ca ?
    Moi j'ai besoin de savoir la taille en octets de la chaine .
    Quand tu vas passer ton tableau a une fonction, cette fonction ne voit que le pointeur, donc si tu fais un sizeof dans la fonction elle ne te retournera pas la taille du tableau mais la taille d'un pointeur.
    Il se produit la meme chose si tu fais de l'allocation dynamique tu n'as que la taille d'un pointeur.

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par gl
    Citation Envoyé par KORTA
    Comment ca ?
    Moi j'ai besoin de savoir la taille en octets de la chaine .
    Quand tu vas passer ton tableau a une fonction, cette fonction ne voit que le pointeur, donc si tu fais un sizeof dans la fonction elle ne te retournera pas la taille du tableau mais la taille d'un pointeur.
    Tres bien mais si je passe la taille à la fonction, aucun probleme, non ?
    Dans ce style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    crypt(char*buffer,int taille);

  11. #11
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Citation Envoyé par KORTA
    Citation Envoyé par gl
    Citation Envoyé par KORTA
    Comment ca ?
    Moi j'ai besoin de savoir la taille en octets de la chaine .
    Quand tu vas passer ton tableau a une fonction, cette fonction ne voit que le pointeur, donc si tu fais un sizeof dans la fonction elle ne te retournera pas la taille du tableau mais la taille d'un pointeur.
    Tres bien mais si je passe la taille à la fonction, aucun probleme, non ?
    Dans ce style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    crypt(char*buffer,int taille);
    Non si tu conserves la taille du tableau dans une variable il n'y a aucun probleme. Le seul souci est l'utilisation de sizeof

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par gl
    Citation Envoyé par KORTA
    Citation Envoyé par gl
    Citation Envoyé par KORTA
    Comment ca ?
    Moi j'ai besoin de savoir la taille en octets de la chaine .
    Quand tu vas passer ton tableau a une fonction, cette fonction ne voit que le pointeur, donc si tu fais un sizeof dans la fonction elle ne te retournera pas la taille du tableau mais la taille d'un pointeur.
    Tres bien mais si je passe la taille à la fonction, aucun probleme, non ?
    Dans ce style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    crypt(char*buffer,int taille);
    Non si tu conserves la taille du tableau dans une variable il n'y a aucun probleme. Le seul souci est l'utilisation de sizeof
    Bon tres bien merci de la précision utile , je passerai à la fonction une variable contenant la taille en octet du buffer. Merci encore et a bientot!

  13. #13
    Expert éminent sénior

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 752
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 752
    Points : 10 683
    Points
    10 683
    Billets dans le blog
    3
    Par défaut
    Tres bien mais si je passe la taille à la fonction, aucun probleme, non ?
    Eh ben voilà, t'as trouvé la solution tout seul. Le mieux et le + propre / fiable, c'est de conserver quelque part la taille de tes tableaux.

  14. #14
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par HW
    Tres bien mais si je passe la taille à la fonction, aucun probleme, non ?
    Eh ben voilà, t'as trouvé la solution tout seul. Le mieux et le + propre / fiable, c'est de conserver quelque part la taille de tes tableaux.
    Bien joué a tous!

  15. #15
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par gl
    Citation Envoyé par KORTA
    Comment ca ?
    Moi j'ai besoin de savoir la taille en octets de la chaine .
    Quand tu vas passer ton tableau a une fonction, cette fonction ne voit que le pointeur, donc si tu fais un sizeof dans la fonction elle ne te retournera pas la taille du tableau mais la taille d'un pointeur.
    Il se produit la meme chose si tu fais de l'allocation dynamique tu n'as que la taille d'un pointeur.
    Alors dans le cas ou je fais de l'allocation dynamique y- t-il moyen de savoir la taille de ce que je pointe? !!

  16. #16
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Points : 4 637
    Points
    4 637
    Par défaut
    Lorsque tu fais ton allocation tu sais quelle taille tu alloues (c'est l'argument du calloc), il suffit de conserver cette taille dans une variable.

  17. #17
    Membre actif
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    304
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 304
    Points : 253
    Points
    253
    Par défaut
    Citation Envoyé par gl
    Lorsque tu fais ton allocation tu sais quelle taille tu alloues (c'est l'argument du calloc), il suffit de conserver cette taille dans une variable.
    Tres bien, effectivement sizeof retourne dans ce cas la taille du pointeur (4 octets:adresses sur 32 bits) ce qui n'est pas interessant dans mon cas, il faut donc comme tu l'indiques conserver la taille allouée dans une variable.
    Merci beaucoup pour l'aide précieuse apportée.!!
    A bientot

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

Discussions similaires

  1. taille du tampon de chaine de caracteres
    Par mimou11 dans le forum Oracle
    Réponses: 1
    Dernier message: 08/11/2010, 09h20
  2. Réponses: 4
    Dernier message: 02/01/2008, 15h11
  3. Taille d'une chaine de caracteres dynamique
    Par BernardT dans le forum C
    Réponses: 5
    Dernier message: 01/11/2007, 02h31
  4. [Optimisation] Taille des champs max de chaines de caractere
    Par okparanoid dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 30/04/2007, 09h12
  5. [langage] taille chaine de caracteres
    Par katikats dans le forum Langage
    Réponses: 8
    Dernier message: 10/01/2005, 11h06

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