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 islower


Sujet :

C

  1. #1
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut aide pour fonction islower
    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
     
    #include <ctype.h>
    #include <stdio.h>
     
    isLow(char *str)
    {
            if(str != NULL)
            {
                    char *p;
                    for(p = str; *p != '\0'; p++)
                    {
                            *p = islower((unsigned) (*p));
                    }
            }
    }
     
     
    int main(void){
     
    char str[] = "mot";
     
    if(isLow(str)) printf("%s is in lowercase", str);
    return 0
    }
    Cette fonction est pour verifier si le mot est en minuscule. Ya t-il qqchose a corriger dans la fonction isLow ?

  2. #2
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Salut,

    On dirait que tu te melanges completement les pinceaux entre islower() et tolower(). Le role de ces 2 fonctions sont dans leur nom : "is" pour savoir si [...] et "to" pour transformer en [...].
    Ici, tu modifies la chaine passée à isLow(), pourtant, tu testes le retour de isLow() donc tu voulais bien savoir si [...]. Donc decide toi : tu veux convertir ta chaine en minuscules ou savoir si elle est en minuscules?

  3. #3
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    A quoi ça te sert de convertir la valeur passée à *lower() en un entier de type unsigned int? La manière correcte de procéder est de convertir en (unsigned char), non?

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  4. #4
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut
    Citation Envoyé par Gruik Voir le message
    Salut,

    On dirait que tu te melanges completement les pinceaux entre islower() et tolower(). Le role de ces 2 fonctions sont dans leur nom : "is" pour savoir si [...] et "to" pour transformer en [...].
    Ici, tu modifies la chaine passée à isLow(), pourtant, tu testes le retour de isLow() donc tu voulais bien savoir si [...]. Donc decide toi : tu veux convertir ta chaine en minuscules ou savoir si elle est en minuscules?

    Je voudrais savoir si elle est en miniscule...

    Thierry, j'ai pas trop compris quand tu parle de convertir en unisgned char, il me semble que c'est qui a ete fait... ?

  5. #5
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Voici mes corrections:

    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
    #include <ctype.h>
    #include <stdio.h>
     
    /*-tc- Attention au prototype. Tu dois déclarer le type de la valeur 
       retournee par isLow() */
    int isLow(char const *str)
    {
        int rv = 0;
     
        if (str != NULL)
        {
            char const *p;
     
            for (p = str; *p != '\0' && islower((unsigned char) *p); p++)
            {
            }
     
            rv = (*p == '\0');
        }
     
        return rv;
    }
     
     
    int main(void)
    {
     
        char str[] = "mot";
     
        if (isLow(str))
        {
            printf("%s is in lowercase", str);
        }
        return 0;
    }
    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  6. #6
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut
    Merci,

    Et si on voulait modifier la fonction isLow() de facon a ce qu'elle verifie si une seule lettre ou toutes sont minuscules ?

    Si la chaine de charactere "str" est definie en tant que "rent", isLow(str) sera vraie. Si str est definie en tant que "Rent" elle est fausse. Comment faire pour qu'elle retourne vraie dans ce sens ?


    VD

  7. #7
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Points : 5 360
    Points
    5 360
    Par défaut
    Citation Envoyé par virtuadrack Voir le message
    Merci,

    Et si on voulait modifier la fonction isLow() de facon a ce qu'elle verifie si une seule lettre ou toutes sont minuscules ?

    Si la chaine de charactere "str" est definie en tant que "rent", isLow(str) sera vraie. Si str est definie en tant que "Rent" elle est fausse. Comment faire pour qu'elle retourne vraie dans ce sens ?


    VD
    Si tu désires que isLow() retourne vrai dans le cas où toutes les lettres sont minuscules et dans le cas ou seule la première lettre est majuscule, il te suffit de commencer le test au 2e caractère:

    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
    int isLow(char const *str)
    {
        int rv = 0;
     
        if (str != NULL)
        {
            char const *p;
     
            for (p = str + 1; *p != '\0' && islower((unsigned char) *p); p++)
            {
            }
     
            rv = (*p == '\0');
        }
     
        return rv;
    }
    Si tu désires accepter la présence d'une (et une seule) lettre majuscule dans le mot:

    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
    int isLow(char const *str)
    {
        int rv = 0;
     
        if (str != NULL)
        {
            char const *p;
            int nmaj = 0;
     
            for (p = str; *p != '\0' && nmaj < 2; p++)
            {
                if (islower((unsigned char) *p) == 0)
                {
                    ++nmaj;
                }
            }
     
            rv = (*p == '\0');
        }
     
        return rv;
    }
    ATTENTION toutefois à ne pas créer de confusion avec l'identifiant de ta fonction. isLow() signifie pour moi "retourne vrai si le mot pointé par str est écrit en minuscules". Je ne m'attend donc pas à ce que isLow() retourne vrai si le premier ou n'importe quel autre caractère est majuscule.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  8. #8
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut
    Dans le meme contexte, si j'ai la fonction suivante qui rend toute la chaine en majuscule

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void uppercase(char *str)
    {
            if(str != NULL)
            {
                    char        *p;
                    for(p = str; *p != '\0'; p++)
                    {
                            *p = toupper((unsigned) (*p));
                    }
            }
    }
    Si je veux ne rendre que la premiere lettre en majuscule ?

  9. #9
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par virtuadrack Voir le message
    Si je veux ne rendre que la premiere lettre en majuscule ?
    Bah tu ne fais pas de boucles, tu ne modifies qu'une fois... C'est un peu évident, non ?
    Pas de Wi-Fi à la maison : CPL

  10. #10
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Bah tu ne fais pas de boucles, tu ne modifies qu'une fois... C'est un peu évident, non ?
    Enlever la boucle et ne modifier qu'une fois, la console m'affiche une Segmentation fault.

  11. #11
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Si tu enleves le for entier, p n'est pas initialisé et pointe sur ce que j'appelle "l'espace intersideral incommensurable".

  12. #12
    Membre régulier
    Inscrit en
    Août 2004
    Messages
    201
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 201
    Points : 83
    Points
    83
    Par défaut
    Citation Envoyé par Gruik Voir le message
    Si tu enleves le for entier, p n'est pas initialisé et pointe sur ce que j'appelle "l'espace intersideral incommensurable".
    Merci

Discussions similaires

  1. Aide pour fonction analyse de dossier en C
    Par Armael dans le forum Linux
    Réponses: 1
    Dernier message: 29/05/2008, 15h12
  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