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 :

Caractere NULL , et '\o'


Sujet :

C

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 371
    Par défaut Caractere NULL , et '\o'
    bonjour

    jutilise des syntaxe sans comprendreleur signification ce qui est navrant ...

    besoin d'xplication sur :


    2- si on declare une chaine , linitialisant de la maniere suivante :

    il est inutile par la suite de rajouter le caractere '\o' a la fin de la chaine ?

    il est faut par la suite de rajouter le caractere '\o' a la fin de la chaine ? sinon ce nest pas chaine it's good ?

    je m'embrouille en ce moment cetait pour avoir vos lumieres

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    besoin d'xplication sur :
    Teste si f est différent de NULL. Tu ne connais pas les opérateurs de comparaison? Où t'as appris le C?
    NULL s'utilise avec les pointeurs pour indiquer qu'elle ne pointe nulle part (donc j'espère bien que ton f là est un pointeur). Par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int n;
    int * p;
     
    ...
     
    p = NULL; /* p ne pointe nulle part */
     
    ...
     
    p = &n; /* p pointe maintenant sur n */
     
    ...
     
    *p = 10; /* <=> n = 10 */
    2 - Si on declare une chaine , l'initialisant de la maniere suivante :
    il est inutile par la suite de rajouter le caractere '\o' a la fin de la chaine ?
    c'est '\0' (backslash zéro), le caractère dont la représentation interne (en tant qu'entier) est 0, pas '\o'. Réponse : oui parce que "" est une chaîne terminée par '\0'.

    '\0' == NULL ???
    A tons avis? est-ce qu'un caractère et un pointeur ont le même type?

    Cette initialisation place 0 dans le premier élément du tableau chaine, et puisque les 37 autres éléments n'ont pas été initialisés, ils seront automatiquement initialisés à 0, indépendament du 0 qu'on a placé dans chaine[0], ici c'est toujours 0.

  3. #3
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par Melem Voir le message
    NULL s'utilise avec les pointeurs pour indiquer qu'elle ne pointe nulle part (donc j'espère bien que ton f là est un pointeur).
    Un pointeur qui stocke une adresse NULL ne pointe pas nulle part, mais pointe sur une adresse invalide.

    A tons avis? est-ce qu'un caractère et un pointeur ont le même type?
    NULL n'a pas forcement le type pointeur. NULL peut-etre (void *) 0, mais aussi simplement 0. Donc, pour certaines implementations, on a bien NULL == '\0' == 0. Mais ce n'est pas l'important. L'important est d'utiliser les choses dans le contexte pour lesquelles elles sont prevues. NULL est prevu pour un contexte pointeur, '\0' pour un contexte caractere.

  4. #4
    Membre chevronné Avatar de Pierre Maurette
    Profil pro
    Inscrit en
    Juillet 2002
    Messages
    283
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Juillet 2002
    Messages : 283
    Par défaut
    Citation Envoyé par Pugebad Voir le message
    bonjour

    jutilise des syntaxe sans comprendreleur signification ce qui est navrant ...

    besoin d'xplication sur :


    NULL est le pointeur nul, défini en fonction de l'implémentation, en général à (void*)0 en général.
    Si f est le retour d'un fopen(), vous voulez savoir si c'est 0, qui indique l'échec. Peu importe comment l'écrire, par exemple que NULL, soit (void*)0, est converti en (FILE*)0, avant de faire la comparaison. Vous pourriez écrire aussi bien if ( f != 0), ou if (f != (FILE*)0) ou if ( f )


    2- si on declare une chaine , linitialisant de la maniere suivante :

    il est inutile par la suite de rajouter le caractere '\o' a la fin de la chaine ?

    il est faut par la suite de rajouter le caractere '\o' a la fin de la chaine ? sinon ce nest pas chaine it's good ?

    je m'embrouille en ce moment cetait pour avoir vos lumieres
    On va reprendre quelques trucs:

    "petrus" est une constante littérale, c'est un pointeur constant, vers zone non modifiable de 7 catactères, les lettres de "petrus" + le '\0' final.
    Donc "" est un pointeur constant vers une zone d'un seul caractère, le '\0' final.

    char chaine[38]; déclare un tableau de 38 char. Si c'est une globale (en gros) le tableau est initialisé automatyiquement par des 0, ou '\0'. Si c'est une variable locale (automatique), le contenu est aléatoire.

    char chaine[] = "petrus"; est équivalent à
    char chaine[7] = "petrus";
    Le tableau chaine est initialisé par les lettres de "petrus" plus le '\0' final. En quelque sorte, par copie de la constante "petrus".
    char chaine[38] = "petrus"; est une initialisation partielle. Dans ce cas, même si chaine est une variable locale (automatique), l'initialisation est complétée par des '\0' jusqu'au bout, sauf erreur de ma part.
    Donc:
    char chaine[38] = "";
    force chaine à être initialisée à 38 '\0', même s'il s'agit d'une variable locale (automatique).
    Dans tous les cas, chaine est un tableau, initialisé d'une façon ou d'une autre, mais en tant que tel, c'est une zone modifiable.

    Notez que:
    char* pointeur = "petrus";
    initialise une simple variable de type char* à la valeur d'un const char*. Il n'y a plus du tout recopie dans une zone modifiable. Et que faire:
    pointeur[0] = 'P';
    devrait conduire à une violation. C'est même souhaitable que le problème survienne le plus tôt possible.

  5. #5
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Citation Envoyé par DaZumba Voir le message
    Un pointeur qui stocke une adresse NULL ne pointe pas nulle part, mais pointe sur une adresse invalide.
    Y a aussi cetainement une centaine d'autres phrases pour exprimer la même chose.

    Citation Envoyé par DaZumba Voir le message
    NULL n'a pas forcement le type pointeur. NULL peut-etre (void *) 0, mais aussi simplement 0. Donc, pour certaines implementations, on a bien NULL == '\0' == 0. Mais ce n'est pas l'important. L'important est d'utiliser les choses dans le contexte pour lesquelles elles sont prevues. NULL est prevu pour un contexte pointeur, '\0' pour un contexte caractere.
    Comme tu l'as dit toi-même, cela dépend de l'implémentation. Et comparer NULL à '\0', même dans une implémentation où ils sont égaux, n'est rien de plus que du bidouillage qui mène nul part.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    371
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 371
    Par défaut
    Citation Envoyé par Pierre Maurette Voir le message
    On va reprendre quelques trucs:

    "petrus" est une constante littérale, c'est un pointeur constant, vers zone non modifiable de 7 catactères, les lettres de "petrus" + le '\0' final.
    Donc "" est un pointeur constant vers une zone d'un seul caractère, le '\0' final.

    char chaine[38]; déclare un tableau de 38 char. Si c'est une globale (en gros) le tableau est initialisé automatyiquement par des 0, ou '\0'. Si c'est une variable locale (automatique), le contenu est aléatoire.

    char chaine[] = "petrus"; est équivalent à
    char chaine[7] = "petrus";
    Le tableau chaine est initialisé par les lettres de "petrus" plus le '\0' final. En quelque sorte, par copie de la constante "petrus".
    char chaine[38] = "petrus"; est une initialisation partielle. Dans ce cas, même si chaine est une variable locale (automatique), l'initialisation est complétée par des '\0' jusqu'au bout, sauf erreur de ma part.
    Donc:
    char chaine[38] = "";
    force chaine à être initialisée à 38 '\0', même s'il s'agit d'une variable locale (automatique).
    Dans tous les cas, chaine est un tableau, initialisé d'une façon ou d'une autre, mais en tant que tel, c'est une zone modifiable.
    merci pour ta réponse. ca va m'aider pas de pb

Discussions similaires

  1. Réponses: 15
    Dernier message: 13/10/2007, 11h39
  2. [XML] [Encoding] Codifier caractère null en XML
    Par Matmal11 dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 10/11/2006, 13h59
  3. Réponses: 3
    Dernier message: 23/12/2005, 16h13
  4. ecriture caractere null dans un fichier
    Par Mitox dans le forum C
    Réponses: 5
    Dernier message: 08/11/2005, 15h52
  5. Chaine de caractere nulle.
    Par mamantins dans le forum C++
    Réponses: 5
    Dernier message: 27/09/2005, 11h21

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