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 :

Convertir tolower - toupper.


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Par défaut Convertir tolower - toupper.
    Bonjour

    J'essaie de converir un texte en minuscul s'il est en majuscul, et vice versa, mais mon code ne convertit qu'en un seul sens, en fonction si c'est toupper ou tolower qui vient en premier.

    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
    #include <stdio.h>
    #include <stdlib.h>
    main(){
    char text[80];
    char texti[80];
    int i, cpt;
     
    for(i=0; (text[i]=getchar())!='\n'; i++)
    cpt=i;
     
    for(i=0; i<=cpt; i++)
    if(tolower(text[i]))
    putchar(toupper(text[i]));
    else if (toupper(text[i]))
    putchar(tolower(text[i]));
    system("PAUSE");
     
    }

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Salux,

    Que voulais tu faire avec "if(tolower(text[i]))" ?
    ça n'a pas de sens :p
    Tu voulais je suppose savoir si c'était une minuscule.. dans ce cas, la condition suivante devrait suffir : "text[i] >= 'a' && text[i] <= 'z'"

    Aussi, il faut voir si tu veux gérer les caractères accentués latins.. (et par la meme occasion voir dans quel encodage est ton texte d'entrée)

  3. #3
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    865
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 865
    Par défaut
    RETURN VALUES
    If the argument is an upper-case letter, the tolower() function returns
    the corresponding lower-case letter if there is one; otherwise the argu-
    ment is returned unchanged.
    tolower te retournera toujours quelque chose de vrai au sens du if (sauf si tu lui passes 0 mais ce n'est pas une lettre).

    Il faut que tu regardes si ton caractère est compris entre 'a' et 'z' (ou entre 'A' et 'Z').

  4. #4
    Membre confirmé Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Par défaut
    ..humm, pourtant pour vérifier si une entrée est de type char ou pas on peut recourir à la formulation suivante:

    if(isalpha(text[i])
    ....

    Si je ne m'abuse, dans ce cas le test foncionne non?

  5. #5
    gl
    gl est déconnecté
    Rédacteur

    Homme Profil pro
    Inscrit en
    Juin 2002
    Messages
    2 165
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Juin 2002
    Messages : 2 165
    Par défaut
    Citation Envoyé par Gruik Voir le message
    Tu voulais je suppose savoir si c'était une minuscule.. dans ce cas, la condition suivante devrait suffir : "text[i] >= 'a' && text[i] <= 'z'"
    Pas terrible. Et si dans le charset utilise, les lettres ne dont pas contigue

    Citation Envoyé par Linu6 Voir le message
    ..humm, pourtant pour vérifier si une entrée est de type char ou pas on peut recourir à la formulation suivante:

    if(isalpha(text[i])
    ....

    Si je ne m'abuse, dans ce cas le test foncionne non?
    Cette fonction indique si il s'agit d'un caractere ou non, pas si il s'agit d'une majuscule ou d'une minuscule.

    Pour connaitre la casse d'une lettre il existe les fonctions isupper et islower

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

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Par défaut
    Citation Envoyé par gl Voir le message
    Pas terrible. Et si dans le charset utilise, les lettres ne dont pas contigue
    Oui mais plus bas je déclarais vaguement que ça dependait de l'encodage
    Et puis c'est plutot rare les encodages qui sont pas à base d'ascii

    Pour connaitre la casse d'une lettre il existe les fonctions isupper et islower
    Jles avais oubliées celles là tiens
    Du coup, si on veut gérer les caractères accentués yaura qu'a changer la locale

  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 : 48
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    En ce qui concerne la saisie, affecter la valeur retournée par getchar() à une variable de type char n'est pas conseillé. Sinon mes commentaires sont dans le code (je suppose que tu n'a pas de caractères spéciaux, e.g. accentués, à traîter):

    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    #include <stdio.h>
    #include <stdlib.h>
    /* -TC- tolower(), toupper(, islower() et isupper() sont déclarées dans le
       fichier d'en-tête standard ctype.h
     */
    #include <ctype.h>
     
    /* -TC- ATTENTION: la fonction main retourne un entier de type int, toujours! */
    int main(void)
    {
        /* -TC- Personnellement, j'initialise toujours un tampon texte de cette
           manière
        */
        char text[80] = {0};
        /* -TC- Attention, getchar() retourne un entier de type int et non un char */
        int c;
        int i;
        int cpt = 0;
     
        /* -TC- affichage de l'invite et vidange du tampon de sortie */
        printf("Entrez un mot: ");
        fflush(stdout);
     
        /* -TC- Saisie caractère par caractère */
        for (i = 0; i < sizeof text - 1 && (c = getchar()) != '\n' && c != EOF; i++)
        {
            text[i] = c;
            cpt++;
        }
        /* -TC- Si c est différent de '\n' ou EOF, c'est que le tampon text est plein.
           On s'empresse d'afficher un message d'avertissement et de le vider le 
           tampon de l'entrée standard.
        */
        if (c != '\n' && c != EOF)
        {
            fprintf(stderr, "Buffer full, your entry has been truncated...\n");
     
            while ((c = getchar()) != '\n' && c != EOF)
            {
                continue;
            }
        }
     
        /* -TC- Attention, ton code présente des erreurs à ce niveau. Ta condition
           d'arrêt est fausse. Par ailleurs, if (tolower(text[i])) est toujours
           vraie à moins que text[i] soit le caractère nul. Je pense que tu voulais
           utiliser islower() et isupper() */
        for (i = 0; i < cpt; i++)
        {
            if (islower(text[i]))
            {
                putchar(toupper(text[i]));
            }
            else
            {
                putchar(tolower(text[i]));
            }
        }
     
        return EXIT_SUCCESS;
     
    }
    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 confirmé Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Par défaut
    Citation Envoyé par gl Voir le message
    Pour connaitre la casse d'une lettre il existe les fonctions isupper et islower

    J'étais sur qu'il y avait une methode testant la case à base de upper ~ lower.., mais j'avais oubliais la formulation exacte!

  9. #9
    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 : 48
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par Linu6 Voir le message

    J'étais sur qu'il y avait une methode testant la case à base de upper ~ lower.., mais j'avais oubliais la formulation exacte!
    D'où l'utilité d'avoir une bonne doc à portée de main...

    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++

    +

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Linu6 Voir le message
    ..humm, pourtant pour vérifier si une entrée est de type char ou pas on peut recourir à la formulation suivante:

    if(isalpha(text[i])
    ....

    Si je ne m'abuse, dans ce cas le test foncionne non?
    tu confonds tolower() et islower()...

  11. #11
    Membre confirmé Avatar de Linu6
    Profil pro
    Inscrit en
    Août 2007
    Messages
    227
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 227
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #define ARRAY_SIZE(a) (sizeof(a)/sizeof(*a))
    char text[80] = "Bienvenue sur developpez.com";
    int i;
     
    for (i = 0; i < ARRAY_SIZE(text) - 1; ++i)
    {
        /* ... */;
    }
    Au fait je n'ai pas compris cette version, (même si les deux autres solutions me semblent très claires)

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

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par Linu6 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #define ARRAY_SIZE(a) (sizeof(a)/sizeof(*a))
    char text[80] = "Bienvenue sur developpez.com";
    int i;
     
    for (i = 0; i < ARRAY_SIZE(text) - 1; ++i)
    {
        /* ... */;
    }
    Au fait je n'ai pas compris cette version, (même si les deux autres solutions me semblent très claires)
    Tu ne comprends pas la macro ? Elle sert à calculer la dimension du tableau (son nombre d'éléments) en fonction de sa définition. En effet, un tableau est une suite contigüe d'éléments identiques. Sa taille est donc la taille d'un élément multipliée le nombre d'éléments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    size = size_of_elem x nb_elem
    réciproquement, le nombre d'éléments (la dimension) est le rapport entre la taille totale et la taille d'un élément :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nb_elem = size / size_of_elem
    (algèbre basique...)

    ce qui se traduit en C en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nb_elem = sizeof tab / sizeof tab[0]
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nb_elem = sizeof tab / sizeof *tab
    La macro ne fait que généraliser ce mécanisme...

  13. #13
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Il faut convertir les char en unsigned char avant de les passer a tolower, islower etc.

  14. #14
    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 : 48
    Localisation : Suisse

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

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Il faut convertir les char en unsigned char avant de les passer a tolower, islower etc.
    A cause de la conversion en int? Merci pour le conseil! Je n'ai jamais fait cette convertion, mais je le ferai à l'avenir...

    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++

    +

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

Discussions similaires

  1. Fonction toupper, tolower et to.?
    Par kayvinn dans le forum Débuter
    Réponses: 8
    Dernier message: 23/01/2010, 13h53
  2. Les fonctionalites toUpper, toLower et Capitalize ?
    Par scifire dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 14/04/2006, 17h51
  3. Réponses: 4
    Dernier message: 06/06/2004, 12h07
  4. Réponses: 3
    Dernier message: 02/07/2003, 16h24
  5. convertir un nom long (win32) en format dos (8+3)
    Par kylekiller dans le forum Langage
    Réponses: 2
    Dernier message: 30/08/2002, 13h34

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