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 :

Réinitialiser une chaine de caractères


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Femme Profil pro
    Inscrit en
    Février 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2013
    Messages : 5
    Par défaut Réinitialiser une chaine de caractères
    Bonjours je suis entrain de débuter en langage C
    et j'ai besoin de votre pour une question bête

    j'ai une chaine de caractères mot je l'ai initialisée à vide
    et puis plus loin dans mon programme je dois la ré-initialiser à vide
    comment je fait ?

    merci et désolé du dérangement

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Bonjour,

    Citation Envoyé par selmastar Voir le message
    j'ai une chaine de caractere mot je l'ai initialiser à vide
    char mot = '\0 ';
    Ca c'est pas une chaine de caractères, c'est juste un caratère.

    Citation Envoyé par selmastar Voir le message
    et puis plus loin dans mon programme je doit la ré-initialiser à vide
    comment je fait ????
    Dans le cas d'une chaine char* mot, justement c'est pas mal (en tout cas c'est la solution la plus simple) d'affecter '\0' au premier caractère :
    Après si tu utilises un tableau il vaut mieux ré-initialiser toutes les cases, si c'est une vraie chaine et que tu ne la ré-utilises plus, il faut libérer la mémoire...

  3. #3
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Citation Envoyé par pythéas
    Après si tu utilises un tableau ...
    Il utilise forcément un tableau pour mettre sa chaine de caractères !

  4. #4
    Membre éclairé Avatar de Ngork
    Homme Profil pro
    Barbare IT
    Inscrit en
    Avril 2009
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Barbare IT
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 160
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #define LONGUEUR_MAXIMALE 26
     
    char mot[LONGUEUR_MAXIMALE+1]="";
    ou bien en dynamique :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define LONGUEUR_MAXIMALE 26
     
    char *mot;
    mot=malloc(LONGUEUR_MAXIMALE+1);
    Pour remettre à zéro :

    Pour un nettoyage complet de la chaîne (à mon avis inutile dans ton cas) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    memset(mot,'\0',LONGUEUR_MAXIMALE+1);

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Février 2013
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2013
    Messages : 9
    Par défaut
    Si il fait l'allocation dynamique via malloc, il suffit de faire un free pour vider la variable.

  6. #6
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Cela ne vide pas la variable (d'ailleurs que signifie 'vider' ici ?) mais la détruit !

  7. #7
    Membre émérite
    Avatar de Kirilenko
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    234
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 234
    Par défaut
    Bonjour,

    Citation Envoyé par Ngork Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #define LONGUEUR_MAXIMALE 26
     
    char mot[LONGUEUR_MAXIMALE+1]="";
    Cela est équivalent à la solution à base de memset, et non pas à celle de l'affectation du premier caractère (§ 6.7.8 de n1570).

    Bonne journée !
    Récursivité en C : épidémie ou hérésie ?

    "Pour être un saint dans l'Église de l'Emacs, il faut vivre une vie pure. Il faut se passer de tout logiciel propriétaire. Heureusement, être célibataire n'est pas obligé. C'est donc bien mieux que les autres églises" - Richard Stallman

  8. #8
    Membre éclairé Avatar de Ngork
    Homme Profil pro
    Barbare IT
    Inscrit en
    Avril 2009
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Barbare IT
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2009
    Messages : 160
    Par défaut
    Salut Kirilenko,

    Sur le fond, l'initialisation mentionnée ne fait qu'attribuer le caractère '\0' au premier caractère de l'espace réservé pour mot. C'est donc équivalent à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define LONGUEUR_MAXIMALE 26
     
    char mot[LONGUEUR_MAXIMALE+1];
    mot[0]='\0';
    Ce qui n'est pas la même chose qu'une initialisation complète de la chaîne par memset :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #define LONGUEUR_MAXIMALE 26
     
    char mot[LONGUEUR_MAXIMALE+1];
    memset(mot,'\0',LONGUEUR_MAXIMALE+1);
    Par ailleurs, le paragraphe 6.7.8 de la N1570 concerne les déclarations des typedef ... ?

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 833
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 833
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par selmastar Voir le message
    et puis plus loin dans mon programme je dois la ré-initialiser à vide
    comment je fait ?
    Salut
    Que signifie en informatique "vide" ??? Une variable n'est jamais vide. Elle contient toujours une valeur.

    Pour répondre à ta question, il te faut comprendre comment le C voit une chaine de caractères...

    En fait, le C ne sait pas manipuler une chaine comme dans d'autres langages où tu peux écrire if "toto" == "toto". Pour lui, une chaine est déjà un truc trop complexe.
    Donc les programmeurs ont adopté la convention qu'une chaine serait un tableau de caractères contenant impérativement un caractère spécial '\0'.
    A partir de là, l'affichage, la comparaison, le remplissage d'une chaine deviennent facile. Suffit de
    • partir du début et afficher tous les caractères jusqu'au '\0'
    • comparer chaque caractère un à un jusqu'au '\0' de l'une ou de l'autre
    • remplir chaque caractère et ajouter en final un '\0'


    Ainsi, les fonctions de manipulation (compter, afficher, comparer) cherchent toutes ce '\0' pour se caler et s'y arrêtent. Donc pour "vider" ou "tronquer" une chaine, suffit juste de placer un '\0' au bon endroit. Tout ce qui se trouve "après" n'étant plus pris en compte c'est comme si ça n'existait plus...

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    char chaine[]="Hello";       // Le compilo remplace par char chaine[]={'H', 'e', 'l', 'l', 'o', '\0'};
     
    // Tronquer la chaine à "He"
    chaine[2]='\0';
    printf("La chaine contient [%s] et sa longueur est %d\n", chaine, strlen(chaine));
     
    // Vider la chaine (si tant est que ce verbe peut avoir un sens en informatique)
    chaine[0]='\0';
    printf("La chaine contient [%s] et sa longueur est %d\n", chaine, strlen(chaine));

    Autre exemple: montrer qu'on n'est pas forcément obligé de partir du début

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    char chaine[]="Hello";
    int i;
     
    // Afficher la chaine en décroissant
    for (i=0; i <= strlen(chaine); i++)  // Pour optimiser vaut mieux mémoriser le strlen() plutôt que de le rappeler à chaque itération
        printf("La chaine contient [%s] et sa longueur est %d\n", chaine + i, strlen(chaine + i));
    // La variable "chaine" n'étant qu'une adresse, rien n'interdit de se décaler par rapport à celle-ci
     
    // Afficher la chaine en croissant
    for (i=strlen(chaine); i >= 0; i--)
        printf("La chaine contient [%s] et sa longueur est %d\n", &chaine[i], strlen(&chaine[i]));
    // &chaine[x] équivaut à chaine + x

    Accessoirement, la vraie question serait de te demander "pourquoi as-tu besoin de vider la chaine" puisque dès que tu feras appel à une fonction de remplissage elle commencera par écraser les caractères utiles puis mettra le '\0' sur le caractère suivant rendant tout ce qui se trouve après virtuellement inexistant...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 9
    Dernier message: 23/12/2013, 16h40
  2. Crypter une chaine de caractères
    Par Yabo dans le forum Réseau
    Réponses: 18
    Dernier message: 19/11/2004, 23h04
  3. Réponses: 9
    Dernier message: 17/01/2003, 11h45
  4. Lire Une Chaine De Caractères
    Par Jonathan_Korvitch dans le forum C
    Réponses: 12
    Dernier message: 07/01/2003, 05h37
  5. Réponses: 2
    Dernier message: 06/12/2002, 07h50

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