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 :

Connaître le nombre d'éléments différents de \0 d'un char array


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre régulier
    Homme Profil pro
    .
    Inscrit en
    Avril 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Avril 2014
    Messages : 9
    Par défaut Connaître le nombre d'éléments différents de \0 d'un char array
    Bonjour à tous,

    J'essaie de connaître le nombre de caractères autres que '\0' d'un array de caractères rempli par l'utilisateur. L'idée est de parcourir cet array (compteur : 'i') et d'incrémenter un compteur représentant le nombre de ces éléments différents de '\0' (compteur : 'j') si et seulement si l'élément en cours est différent de '\0'.

    A priori, ça devrait fonctionner ! Mais mon programme affiche toujours une taille de 10... Je vous montre le code :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    char chaine[10];
    scanf("Tapez une chaîne de caractères : %s", chaine); // scanf va remplir chaine de l'élément n°0 à l'élément n°[taille-1 de la saisie] et placera un '\0' juste après ce dernier élément
     
        int j = 0; // représente le nombre d'éléments != '\0'
     
        int i = 0;
        while (i < sizeof(chaine)) {
            if (chaine[i] != '\0')
                j++;
     
            i++;
        }

    Voilà.
    Je ne comprends pas du tout pourquoi ça ne marche pas. Pourriez-vous m'aider svp ? :-/

    Merci d'avance et bonne continuation

  2. #2
    Membre habitué
    Homme Profil pro
    Lycéen
    Inscrit en
    Octobre 2013
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Octobre 2013
    Messages : 11
    Par défaut
    Dans le code, il y as deux choses qui ne vont pas :

    -1ere : si la taille de ta chaîne est inférieure a 10, une fois que le '\0' est passé, on continue d'incrémenter j.
    Ce qui veut dire que si on a par exemple "salut", (5 caractère, plus 1, en tout 6) j affichera 9 (10 moins le '\0')

    -2eme : si la taille de ta chaîne est supérieure a 10, (ce qui a sûrement du se passer) on ne vera jamais le '\0', car il est plus loin dans la memoire.
    Dans ce cas là fais attention au butteroverflow qui risque de se produire.

    Bref je te conseille plutôt de faire :
    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
    char chaine[10];
    char fini = 0;
    fgets(chaine, 10, stdin);// va recuperer 10 caractère max sur le clavier
        int j = 0; // représente le nombre d'éléments != '\0'
     
        int i = 0;
        while (i < sizeof(chaine) && !fini) {
            if (chaine[i] != '\0')
            {
                j++;
            }
            else
            {
                fini = 1;
            }
     
            i++;
    }

  3. #3
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Sans prendre en compte ton fgets mais juste pour te montrer une autre manière de faire pour connaître manuellement (sinon tu as strlen qui le fait très bien) le nombre de caractères dans une chaîne:

    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main (void)
    {
       char chaine[30] = "Bonjour, le monde !";
       char * p = chaine;
       int len = 0;
     
       while (*p++ != '\0')
          len++;
     
       printf("Taille de la chaine: %d\n", len);
     
       return EXIT_SUCCESS;
    }
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  4. #4
    Membre régulier
    Homme Profil pro
    .
    Inscrit en
    Avril 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Avril 2014
    Messages : 9
    Par défaut
    Re,

    @ymerej5312 :

    Je ne comprends pas comment tu résouds le premier problème juste en utilisant fgets :-/

    Et sinon j'ai mis à jour mon code, en remplissant mon array avec 10 '\0'. Ca devrait corriger le premier problème. Maintenant, ça me renvoie toujours une taille de 0 si j'utilise scanf. Pourquoi ?

    Par contre si j'utilise fgets, pas de problème, ça marche... C'est bizarre.

    Voici le nouveau code (rien n'a changé à part le remplissage du tableau) :
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
        char chaine[10] = {'\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0'};
     
        scanf("Tapez une chaîne de caractères : %s", chaine);
     
        int j = 0;
        int i = 0;
     
        while (i < sizeof(chaine)) {
            if (chaine[i] != '\0')
                j++;
     
            i++;
        }



    @Franck.H :
    Oh, c'est sympa comme astuce ça ! Merci !

  5. #5
    Membre régulier
    Homme Profil pro
    .
    Inscrit en
    Avril 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Avril 2014
    Messages : 9
    Par défaut
    Wouuups, ça y est, j'ai trouvé le truc qui n'allait pas.

    Je pensais que le premier paramètre de scanf, ici "Tapez blabla %s", permettait de renseigner le texte de la question. Mais visiblement, c'est une sorte de regex. Excusez-moi... !

    Merci à vous deux !

  6. #6
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par Nohak_ Voir le message
    Par contre si j'utilise fgets, pas de problème, ça marche... C'est bizarre.
    De toutes manières, il vaut mieux utiliser fgets qui est plus sécuritaire et si tu n'as pas besoin de formatage spécifique de la chaîne.

    Citation Envoyé par Nohak_ Voir le message
    @Franck.H :
    Oh, c'est sympa comme astuce ça ! Merci !
    De rien
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

  7. #7
    Membre régulier
    Homme Profil pro
    .
    Inscrit en
    Avril 2014
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : .

    Informations forums :
    Inscription : Avril 2014
    Messages : 9
    Par défaut
    Alors j'ai juste une toute petite dernière question... :-3

    Lorsque j'écris : char test[10]; , test contiendra 10 valeurs aléatoires de la RAM non ? (et dont les cases-mémoires sont contiguës) Ou bien test contiendra 10 valeurs vides ou bien 10 valeurs égales à '\0' ? Je suis certain à 90% que ma première proposition est la bonne

    Oh, et puis une dernière question pour la route ! Comment remplir tous les éléments d'un array avec une seule valeur ? Parce que bon, pour un tableau de 10 éléments je fais : {'a', 'a','a' jusqu'à 10} , mais pour un tableau de 12 000 éléments, ça va être un peu chaud. Bien sûr je pourrais utiliser un for, mais bon... Y a pas un moyen plus efficace ? J'ai entendu parler de cette technique : char t[10] = {'a'}; mais cela remplit-il vraiment tout t avec 'a', ou bien juste le premier élément ?...

    Merci d'avance !

  8. #8
    Membre émérite
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2014
    Messages
    345
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2014
    Messages : 345
    Par défaut
    Citation Envoyé par ymerej5312 Voir le message
    Dans ce cas là fais attention au butteroverflow qui risque de se produire.

    Sinon tu peux utiliser la fonction butterset qui va remplir ton buffer de beurre ...

  9. #9
    Rédacteur
    Avatar de Franck.H
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2004
    Messages
    6 951
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Service public

    Informations forums :
    Inscription : Janvier 2004
    Messages : 6 951
    Par défaut
    Citation Envoyé par the Hound Voir le message

    Sinon tu peux utiliser la fonction butterset qui va remplir ton buffer de beurre ...
    J'avais pas remarqué la coquille
    Mon Site
    Ma bibliothèque de gestion des chaînes de caractères en C

    L'imagination est plus importante que le savoir. A. Einstein

    Je ne répond à aucune question technique par MP, merci d'avance !

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

Discussions similaires

  1. [XL-2010] Connaître le nombre d'éléments d'un tableau
    Par Harry Covair dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 12/09/2013, 13h34
  2. Réponses: 2
    Dernier message: 24/05/2011, 09h32
  3. Connaître le nombre d'éléments d'un tableau
    Par gege2061 dans le forum Télécharger
    Réponses: 0
    Dernier message: 30/11/2010, 16h39
  4. Réponses: 2
    Dernier message: 28/04/2006, 13h28
  5. UNION de deux SELECT avec nombre d'arguments différents
    Par orus8 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 16/07/2004, 14h32

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