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 :

Aide pour fonction "always evaluate as true"


Sujet :

C++

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 5
    Par défaut Aide pour fonction "always evaluate as true"
    Bonjour,

    Je débute dans la programmation, j'essaye de faire un programme en C++ qui vérifie la validité de la chaîne de caractère que l'on entre. j'aimerais donc faire une fonction qui vérifie que le texte entré ne comporte que des lettres ou des chiffres

    voila ce que j'ai fait
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
    #include <iostream.h>
    #include <stdlib.h>
    char adresse[50];
    int i,a,f;
    // Fonction vérifie la validité des caractères de l'adresse
    int valide_ad(char adresse[],int C)
    { int i,b=0;
        for (i=1; i <= C+1; i++)
        {
            if ((adresse[i-1]>='A' && adresse[i-1]<='Z') || (adresse[i-1]>='0' && adresse[i-1]<='9') || (adresse[i-1]>='a' && adresse[i-1]<='z') ||(adresse[i-1]=='.'))
            {b = b;}
            else 
            {b++;}
        }return b;
     
    }
    int main()
    {
        do
        { cout<<"donner ";
        cin>>adresse;
     
        a = strlen(adresse);
     
              if (valide_ad(adresse,a)>0)
      {cout<<"votre nom utilisateur comporte des characrtère autre que des lettres, des chiffres, des points "<<endl;}
    }
    while ( (adresse[0]!='0') || (strlen(adresse)>1) );
        system("pause");
    }

    Mon problème c'est que j'ai ce message quand je compile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "[Warning] the address of `int valide_ad(char*, int)', will always evaluate as `true' "
    je vois absolument pas pourquoi ce message apparaît. Si quelqu'un pourrait m'eclaircir sur le sujet ca m'aiderait beaucoup

    Merci d'avance

  2. #2
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Il faut que tu fasses un effort sur l'indentation de ton code, sans quoi il devient difficile à lire.

    Je n'ai rien changé à part des caractères blancs ajoutés judicieusement.

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
     
    #include <iostream.h>
    #include <stdlib.h>
     
    char adresse[50];
    int i,a,f;
     
    // Fonction vérifie la validité des caractères de l'adresse
    int valide_ad(char adresse[], int C)
    { 
        int i,b=0;
     
        for (i=1; i <= C+1; i++)
        {
            if ((adresse[i-1] >= 'A' && adresse[i-1] <= 'Z') || 
                (adresse[i-1] >= '0' && adresse[i-1] <= '9') || 
                (adresse[i-1] >= 'a' && adresse[i-1] <= 'z') ||
                (adresse[i-1] == '.'))
            {
                b = b;
            }
            else 
            {
                b++;
            }
        }
     
        return b;
    }
     
    int main()
    {
        do
        { 
            cout << "donner ";
            cin >> adresse;
     
            a = strlen(adresse);
     
            if (valide_ad(adresse, a) > 0)
            {
                cout << "votre nom utilisateur comporte des caractères "
                    << "autre que des lettres, des chiffres, des points "<< endl;
            }
        }  
        while ((adresse[0] != '0') || (strlen(adresse)>1));
     
        system("pause");
    }
    C'est quoi l'idée derrière for (i=1; i <= C+1; i++) puis adresse[i-1] ? Autant faire commencer i à 0 et le terminer à C.

    Sinon, pour répondre à ta question, je dirais qu'il n'y a rien dans le code qui puisse s'appliquer à l'erreur que tu indiques. Donc soit tu compiles le mauvais code source (c'est à dire pas celui que tu as posté), soit tu ne nous as pas donné tout le code.
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Bonjour,

    En C++, les fichiers d'en-têtes ne sont pas #include <iostream.h> et #include <stdlib.h> mais #include <iostream> et #include <cstdlib>.


    adresse, i, a et f sont définies comme variables globales. Ce qui est inutile et une mauvaise pratique. Il faut préférer la définition des variables dans la portée la plus petite qui suffise à son utilisation.

    Il existe le type bool plutôt qu'un int pour la fonction.

    Comme le souligne Emmanuel, un tableau se parcourt de [0,n[, taille non incluse : for(int i=0;i<n;++i).

    Tu as oublié un retour à la fonction main.

    Tu peux très bien utilisé un bloc vide plutôt que b=b pour marquer que dans ce cas tu ne veux pas changer la valeur de la variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
            if ((adresse[i] >= 'A' && adresse[i] <= 'Z') ||
                (adresse[i] >= '0' && adresse[i] <= '9') ||
                (adresse[i] >= 'a' && adresse[i] <= 'z') ||
                (adresse[i] == '.'))
            {
            }
            else
            {
    C'est une pratique assez courante.

    La recherche est fructueuse dès qu'au moins un caractère n'est plus alphanumérique. Tu peux donc cesser le parcours de la chaîne dès que la condition devient fausse.

    Les chaînes de caractère en C++ sont std::string.

    while ((adresse[0] != '0') || (strlen(adresse)>1)); : ces deux tests sont redondants, autant n'en utiliser qu'un seul.

    Au final, cela pourrait ressembler à
    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    #include <iostream>
    #include <cstdlib>
    #include <string>
     
    using std::cout;
    using std::cin;
    using std::endl;
     
    // Fonction vérifie la validité des caractères de l'adresse
    bool valide_ad(std::string adresse, int C)
    {
        for (int i=0; i < C; ++i)
        {
            if ((adresse[i] >= 'A' && adresse[i] <= 'Z') ||
                (adresse[i] >= '0' && adresse[i] <= '9') ||
                (adresse[i] >= 'a' && adresse[i] <= 'z') ||
                (adresse[i] == '.'))
            {
            }
            else
            {
                return true;
            }
        }
     
        return false;
    }
     
    int main()
    {
        std::string adresse;
        int a;
     
        do
        {
            cout << "donner ";
            cin >> adresse;
     
            a = adresse.size();
     
            if (valide_ad(adresse, a) > 0)
            {
                cout << "votre nom utilisateur comporte des caractères "
                    << "autre que des lettres, des chiffres, des points "<< endl;
            }
        }
        while (adresse.size()>1);
     
        system("pause");
     
        return 0;
    }

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 5
    Par défaut
    tout d'abord je tient a m'excuser si mon code est pas très lisible, je suppose que c'est ce que signifie le mot indentation. Je suis vraiment un débutant en programmation.

    Sinon concernant l’erreur elle n’apparaît plus mais je n'ai pourtant rien changé, j’avoue que je suis un perdu.

    En revanche le résultat obtenu n'est absolument pas celui que je veux obtenir.
    Ce que je voulais faire c'est :
    1.tant que l'on n'entre pas "0" le programme redemande d'entrée un nom utilisateur
    2.la chaîne de caractère entrée est traité par un appel à une fonction afin de vérifier qu'elle ne contient que des lettres, des chiffres ou un point.
    3.Si la chaîne de caractère entrée n'est pas valide renvoyer une phrase pour expliciter

    Or dans ce code à chaque fois que j'entre une chaîne de caractère elle est tout le temps considérée comme incorrecte

    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
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
     
    #include <iostream.h>
    #include <stdlib.h>
     
    char adresse[50];
    int i,a,f;
     
    // Fonction vérifie la validité des caractères de l'adresse
    int valide_ad(char adresse[], int C)
    { 
     int i,b=0;
        for (i=0; i <= C; i++)
        {
            if ((adresse[i] >= 'A' && adresse[i] <= 'Z') || 
                (adresse[i] >= '0' && adresse[i] <= '9') || 
                (adresse[i] >= 'a' && adresse[i] <= 'z') ||
                (adresse[i] == '.'))
            {
                b;
            }
            else 
            {
                b++;
            }
        }
     
        return b;
    }
     
    int main()
    {
        do
        { 
            cout << "donner  le nom utilisateur";
            cin >> adresse;
     
            a = strlen(adresse);
     
            if (valide_ad(adresse, a) > 0)
            {
                cout << "votre nom utilisateur comporte des caractères "
                    << "autre que des lettres, des chiffres, des points "<< endl;
            }
        }  
        while ((adresse[0] != '0') || (strlen(adresse)>1));
     
        system("pause");
    }
    pourriez vous me donner une piste ou m'expliquer ce qui cloche dans le code ci-dessus

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 5
    Par défaut
    ah une réponse entre temps, merci beaucoup le programme marchetrès bien mais pour apprendre j'ai tout de même quelques questions :

    -tout d'abord concernant les entêtes j'ai employé celle que notre professeur nous avait dit, peux tu m'expliquer ce quelles changent et/ou ce qu'elles permettent pour ce programme ?

    -pourrais tu m'expliquer le return 0 à la fin du programme

    -Bien que je comprenne l'utilisation d'un "bool", pourquoi le int ici ne marche pas ?

    - enfin que signifie les les "Std::"?

  6. #6
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Salut.

    Citation Envoyé par 3DArchi Voir le message
    while ((adresse[0] != '0') || (strlen(adresse)>1)); : ces deux tests sont redondants, autant n'en utiliser qu'un seul.
    Tu ne confondrais pas avec l'une des lignes suivantes, par hasard ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while ((adresse[0] != '\0') || (strlen(adresse)>1));
    while ((adresse[0] != 0) || (strlen(adresse)>1));

    Citation Envoyé par tony5555 Voir le message
    -tout d'abord concernant les entêtes j'ai employé celle que notre professeur nous avait dit, peux tu m'expliquer ce quelles changent et/ou ce qu'elles permettent pour ce programme ?
    Pour #include <stdlib.h>, à la limite ça peut se comprendre, ça vient du C.
    Mais alors #include <iostream.h>, là j'ai du mal à croire que ton prof t'ait indiqué cet en-tête.
    Ou alors, c'est qu'il a appris le C++ il y a vraiment longtemps et qu'il n'a pas fait de mise à jour...
    Je crois avoir lu que pour des raisons de rétrocompatibilité, des fichiers d'en-tête standard en *.h avaient été gardés.

    Mais à présent, tous les fichiers d'en-tête de la bibliothèque standard sont sans extension.
    Donc...
    Citation Envoyé par 3DArchi Voir le message
    En C++, les fichiers d'en-têtes ne sont pas #include <iostream.h> (...) mais #include <iostream> (...).
    De plus, certains fichiers d'en-tête C particulièrement utilisés (même en C++) ont été redéfinis pour le C++.
    Enfin, disons repris.
    Pour cela, on a rajouté un « c » devant le nom, et retiré l'extension.
    Et alors #include <stdlib.h> devient #include <cstdlib>, #include <stdio.h> devient #include <cstdio>, #include <ctype.h> devient #include <cctype>, etc.


    Citation Envoyé par tony5555 Voir le message
    -pourrais tu m'expliquer le return 0 à la fin du programme
    Si tu fais attention à la signature de la fonction principale : int main(...).
    Donc, logiquement, elle attend un entier comme valeur de retour.
    Mais à quoi peut bien servir cette valeur puisque le programme est terminé ?
    Eh bien elle sert de code de retour du programme.

    Un certain nombre de commandes renvoient un code de retour pour indiquer si tout s'est bien passé, si une erreur est survenue, ou toute autre information utile.
    À vrai dire, toutes les commandes renvoient un code de retour, mais il n'est pas toujours exploité.
    Les programmes C/C++ ne font pas exception à la règle.

    Par convention, on retourne 0 pour indiquer que l'exécution d'un programme s'est bien déroulé, et une valeur non nulle autrement.
    Si tu veux connaître précisément le pourquoi du comment, je laisse les spécialistes répondre...

    Pour information, l'en-tête cstdlib ( ou stdlib.h en C) définit deux constantes à cet effet : EXIT_SUCCESS et EXIT_FAILURE.
    Je ne te fais pas l'affront de t'expliquer ce qu'elles signifient...


    Citation Envoyé par tony5555 Voir le message
    -Bien que je comprenne l'utilisation d'un "bool", pourquoi le int ici ne marche pas ?
    Il n'a pas dit que ça ne marchait pas, mais que c'était plus approprié.
    À moins que tu aies absolument besoin de compter le nombres de caractères « invalides », tu peux arrêter le parcours de la chaîne dès que tu rencontres l'un d'eux.
    Et alors il paraît plus logique de renvoyer un booléen.
    Après tout, la réponse à la question « la chaîne est-elle valide ? » est « oui » ou « non ».


    Citation Envoyé par tony5555 Voir le message
    - enfin que signifie les les "Std::"?
    En C++, les classes, fonctions et objets de la bibliothèque standard sont déclarés dans l'espace de nom (« namespace » en anglais) std.
    Un peu de lecture dans la F.A.Q C++ devrait compléter la réponse.

    Bonne continuation

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2011
    Messages : 5
    Par défaut
    ok merci

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Citation Envoyé par Steph_ng8 Voir le message
    Tu ne confondrais pas avec l'une des lignes suivantes, par hasard ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    while ((adresse[0] != '\0') || (strlen(adresse)>1));
    while ((adresse[0] != 0) || (strlen(adresse)>1));
    Si. Ecriture rapide et sans relecture de ma part. dsl.

Discussions similaires

  1. aide pour fonction islower
    Par virtuadrack dans le forum C
    Réponses: 11
    Dernier message: 27/09/2007, 00h31
  2. aide pour fonction switch problème
    Par mitherkiller dans le forum C
    Réponses: 10
    Dernier message: 02/03/2007, 15h03
  3. besoin d'aide pour fonction de conversion de base
    Par babou54 dans le forum Delphi
    Réponses: 12
    Dernier message: 13/01/2007, 21h06
  4. Besoin d'aide pour fonctions OpenSSL..... HELP !!!
    Par aide64 dans le forum Langage
    Réponses: 7
    Dernier message: 12/05/2006, 17h46
  5. Debutant en C cherche aide pour fonctions!!!!
    Par benji17c dans le forum C
    Réponses: 5
    Dernier message: 30/09/2003, 12h47

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