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 :

zéro final sur chaine, éclairsisement


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 119
    Par défaut zéro final sur chaine, éclairsisement
    Bonjour a tous,


    Voila , je sais que toutes les chaine de caractère en C se termine par 0, on est bien daccord . Cependant une question me chiffone depuis bien longtemp.

    Pour déclarer une chaine avec 10 caractère on fait ceci :

    char szData[10+1];

    Car on compte le 0.

    Mais ma question se pose lors d'une allocation dynamique , exemple :

    char * szData;
    long lSizeFile = 3313;

    szData = (char*) malloc(sizeof(char)*lSize);

    Ce que je ne comprend pas, c'est que lSize contient exactement la taille du fichier et lorsque on lit le contenut du fichier, on dirait que le 0 final c'est mit directement . Si on suis le raisonement, on aurai du faire :

    char * szData;
    long lSizeFile = 3313;

    szData = (char*) malloc(sizeof(char)*(lSize+1));
    *szData+lSize=0;

    J'espère que vous voyez ce que je veu dire.

    est-ce parce que on alloue 3313 et que vu que l'on compte pour un chaine de 0-3312 est ce que le dernier byte est mis directement à zéro comme fin de chaine ?

    Merci d'avance.

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Par défaut
    C'est un coup de chance que tu aies l'impression à l'affichage qu'un zéro s'est mis automatiquement. Si la longueur du fichier est 3313, il faut pour le lire correctement 3313 bytes et pour l'aggicher correctement (si c'est un fichier texte) 3313+1 bytes pour mettre le zéro terminal.
    PS sizeof char = 1 par définition, donc inutile de la préciser.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2005
    Messages : 119
    Par défaut
    et pour l'aggicher correctement (si c'est un fichier texte) . Que se soit ou non un fichier texte, dés que je déclare une chaine de caract pour recevoir le contenut , un zéro final est de mise.

  4. #4
    Membre Expert Avatar de zooro
    Homme Profil pro
    Développeur Java
    Inscrit en
    Avril 2006
    Messages
    921
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Avril 2006
    Messages : 921
    Par défaut
    Citation Envoyé par deck_bsd
    est-ce parce que on alloue 3313 et que vu que l'on compte pour un chaine de 0-3312 est ce que le dernier byte est mis directement à zéro comme fin de chaine ?
    De toutes façons, le 0 final n'est jamais mis automatiquement, ni les 0 intermédiaires, d'ailleurs. C'est à toi de les positionner. Par memset(szData, '\0', lSize+1) par exemple, avec ton code.

  5. #5
    Membre expérimenté
    Inscrit en
    Septembre 2006
    Messages
    414
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 414
    Par défaut
    Citation Envoyé par deck_bsd
    *szData+lSize=0;
    pas bon,
    c'est:

    ou bien meme:

    et sinon si tu utilise fgets() pour lire un fichier, le '\0' sera mis automatiquement !

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 194
    Par défaut
    '\0' n'est la que pour les fonctions spécifiques au chaines du genre strlen, strcpy etc... pour justement indiquer une fin de chaine

    donc pour prendre les données d'un fichier nul besoin d'avoir le '\0' (par exemple si on connait la taille et qu'on fait une copie)

  7. #7
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par coca25
    '\0' n'est la que pour les fonctions spécifiques au chaines du genre strlen, strcpy etc... pour justement indiquer une fin de chaine

    donc pour prendre les données d'un fichier nul besoin d'avoir le '\0' (par exemple si on connait la taille et qu'on fait une copie)
    Sauf que tu n'est pas forcément sur de l'usage qui sera fait des chaines que tu auras lues dans le fichier...

    Et que, fatalement, il y aura un moment où tu "oubliras" ne pas avoir le 0 final, et que tu essayeras d'utiliser une foction str* quelconque dessus... avec un joli plantage en perspective...

    Ce n'est pas moi qui le dit (car tu peux mettre ma parole en doute), mais c'est la "loi de Murphy"

    Moralité: ca ne coute pas plus cher de prévoir de manière systématique l'allocation de taille+1 et de mettre d'office le 0 final... Mais ca permettra d'éviter énormément de problèmes...

    Donc, autant le faire, tu ne crois pas
    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

  8. #8
    Membre expérimenté
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    194
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 194
    Par défaut
    Sauf que tu n'est pas forcément sur de l'usage qui sera fait des chaines que tu auras lues dans le fichier...
    si c'est moi qui gére la fonction ou le programme si je sais pourquoi je lis un fichier
    Ce n'est pas moi qui le dit (car tu peux mettre ma parole en doute), mais c'est la "loi de Murphy"
    en partant de ce principe, tu peux allouer de la mémoire et puis ton fichier en fera plus un jour etc... on en finit pas
    Moralité: ca ne coute pas plus cher de prévoir de manière systématique l'allocation de taille+1 et de mettre d'office le 0 final... Mais ca permettra d'éviter énormément de problèmes...

    Donc, autant le faire, tu ne crois pas
    mais sinon je suis d'accord... je voulais juste préciser qu'on peut s'en passer pour un programme qui n'a pas besoin de connaitre les fin de chaines

  9. #9
    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 coca25
    je voulais juste préciser qu'on peut s'en passer pour un programme qui n'a pas besoin de connaitre les fin de chaines
    N'existe pas. Une chaine C est une chaine C.

Discussions similaires

  1. Travail sur chaine de caractère
    Par corben dallas dans le forum Access
    Réponses: 4
    Dernier message: 02/01/2006, 19h22
  2. [VB.NET] Traitement sur chaine (simple)
    Par Tempotpo dans le forum Windows Forms
    Réponses: 4
    Dernier message: 24/03/2005, 13h20
  3. actions sur chaine
    Par ericmart dans le forum ASP
    Réponses: 2
    Dernier message: 22/12/2004, 10h03
  4. Réponses: 3
    Dernier message: 19/12/2004, 14h30
  5. [Debutant][Tableau] Tableau indexé sur chaine de caractères
    Par SamRay1024 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 07/05/2004, 11h14

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