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 :

question sur les char (caractère '\0')


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 28
    Par défaut question sur les char (caractère '\0')
    Bonjour,

    les chaines de caractères en C/C++ doivent finir par le caractère '\0'. Donc pour travailler avec une chaine de taille SIZE_CHAR il faut declarer : char ma_chaine[SIZE_CHAR+1]. et le "+1" sert pour mettre le fameux '\0'.

    Maintenant je suis entrain de reprendre du code et je vois des char chaine[2]. Donc ma question est la suivante :

    - est-il vrai que dans cette chaine on ne peut mettre qu'un caractère et que le dernier c un '\0'. Si oui un char[2] ca sert a quoi ??
    - si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char ma_chaine[2];
    memset(ma_chaine,0,2);
    memcpy(ma_chaine,autrechaine,2);
    est-ce qu'il y a un risque de core dump et qu'ils ont du bol que ca c pas produit ??

    Environnement : Windows XP, Visual C++ 6.0

  2. #2
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par samitriani Voir le message
    - est-il vrai que dans cette chaine on ne peut mettre qu'un caractère et que le dernier c un '\0'.
    Oui.
    Si oui un char[2] ca sert a quoi ??
    Hors-contexte, impossible de le dire. Il arrive qu'on s'en serve pour convertir à peu de frais un char seul en chaîne.
    - si je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    char ma_chaine[2];
    memset(ma_chaine,0,2);
    memcpy(ma_chaine,autrechaine,2);
    est-ce qu'il y a un risque de core dump et qu'ils ont du bol que ca c pas produit ??
    Si autrechaine fait plus d'un caractère, oui il y a un risque de segfault (Access Violation sous Windows), mais pas lors du memcpy() lui même: Plutôt dans la lecture de la chaîne par la suite (vu qu'elle n'aura pas de marqueur de fin).
    De plus, quand un bug passe inaperçu, c'est de la malchance, pas du bol.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 28
    Par défaut
    Ah voilà !!
    Tu confirmes mes doutes. Seule chance que ca marche c que autrechaine soit de taille 1 ou que le deuxième caractère soit à 0.

    Merciiiiiiiii

  4. #4
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Citation Envoyé par samitriani Voir le message
    Seule chance que ca marche c que autrechaine soit de taille 1 ou que le deuxième caractère soit à 0.
    Ce qui vu du C, est exactement la même chose.
    Mais il y a aussi un second cas où ça marche: Celui où autrechaine est de taille nulle.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    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 : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par samitriani Voir le message
    Ah voilà !!
    Tu confirmes mes doutes. Seule chance que ca marche c que autrechaine soit de taille 1 ou que le deuxième caractère soit à 0.

    Merciiiiiiiii
    Ca fonctionnera effectivement si autrechaine est une chaine de longueur inférieure ou égale à 1 mais également si ma_chaine ne soit pas utilisée comme chaine de caractères mais comme simple tableau de caractère, ou si le \0 terminal est forcé par la suite, ou si ...

    Le code présenté dans ton exemple ne pose par lui même aucun problème.
    Il n'est à priori pas possible de savoir si un problème sera rencontré ailleurs dans le code sans analyser l'intégralité dudit code.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    28
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : France

    Informations forums :
    Inscription : Mars 2008
    Messages : 28
    Par défaut
    Citation Envoyé par gl Voir le message
    Ca fonctionnera effectivement si autrechaine est une chaine de longueur inférieure ou égale à 1 mais également si ma_chaine ne soit pas utilisée comme chaine de caractères mais comme simple tableau de caractère, ou si le \0 terminal est forcé par la suite, ou si ...

    Le code présenté dans ton exemple ne pose par lui même aucun problème.
    Il n'est à priori pas possible de savoir si un problème sera rencontré ailleurs dans le code sans analyser l'intégralité dudit code.
    Bah le tableau en question est par la suite passé a une fonction d'une librairie externe au projet. Mais c juste que mon code ne présente pas de problème. Le risque est dans la lecture du tableau en tant que chaine.

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

Discussions similaires

  1. question sur les chaines de caractères
    Par yacin87 dans le forum Débuter avec Java
    Réponses: 7
    Dernier message: 11/04/2010, 22h19
  2. question sur les chaines de caractère
    Par yacin87 dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 10/04/2010, 08h59
  3. Réponses: 9
    Dernier message: 16/02/2007, 21h37
  4. question sur les chaine de caractères
    Par amy0o0 dans le forum C
    Réponses: 11
    Dernier message: 14/10/2006, 14h14
  5. question sur les chaines de caractères
    Par pierrOPSG dans le forum C
    Réponses: 5
    Dernier message: 13/04/2006, 18h55

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