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 :

Chaîne de caractères


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    67
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 67
    Par défaut Chaîne de caractères
    bonjour,
    si on veut créer une fonction qui dans une chaîne de caractère, convertit les majuscules en minuscules, et les minuscules en majuscules, comment faudrait-il procéder ?
    merci.

  2. #2
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    si on veut créer une fonction qui dans une chaîne de caractère, convertit les majuscules en minuscules, et les minuscules en majuscules, comment faudrait-il procéder ?
    Il faudrait lire la documentation des fonctions de la bibliothèque standard et ainsi trouver les deux fonctions qui font la conversion minuscules <-> majuscules.

  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
    Un pointeur sur la chaîne en argument de la fonction. Dans la fonction, une boucle qui parcours la chaîne caractère par caractère et pour chaque caractère, du détermine s'il est en majuscule ou minuscule avec les fonctions islower et isupper et tu fait l'opération qui va bien avec les fonctions tolower/toupper

    Fait la fonction et reviens ici
    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 éclairé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    52
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 52
    Par défaut
    Dans ta fonction recevant comme parametre un pointeur sur la chaine a transformer,

    Tu déclares un pointeur (char *pt)que tu initialises sur le début de ta chaîne.
    si *pt est compris entre 'a' et 'z',
    tu y rajoutes 'A'-'a'
    sinon
    si *pt est compris entre 'A' et 'Z', tu y rajoutes 'a'-'A'

    tu incrémentes ton pointeur jusqu'à ce que tu rencontre le 0 de fin de chaîne.

  5. #5
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par Franck.H Voir le message
    Un pointeur sur la chaîne en argument de la fonction. Dans la fonction, une boucle qui parcours la chaîne caractère par caractère et pour chaque caractère, du détermine s'il est en majuscule ou minuscule avec les fonctions islower et isupper et tu fait l'opération qui va bien avec les fonctions tolower/toupper
    Pff, c'est difficile de faire chercher les POs par eux-mêmes, dans ce forum...

  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 DaZumba Voir le message
    Pff, c'est difficile de faire chercher les POs par eux-mêmes, dans ce forum...
    Ouais En fait je ne le met que sur la voie, c'est à lui de coder la fonction
    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 prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 859
    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 859
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Fred83 Voir le message
    si *pt est compris entre 'a' et 'z'
    Ceci n'est pas portable. Faut utiliser "islower()"
    Citation Envoyé par Fred83 Voir le message
    tu y rajoutes 'A'-'a'
    Idem => passer par "toupper()"
    Citation Envoyé par Fred83 Voir le message
    si *pt est compris entre 'A' et 'Z'
    => isupper()
    Citation Envoyé par Fred83 Voir le message
    tu y rajoutes 'a'-'A'
    => tolower()
    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]

  8. #8
    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 Fred83 Voir le message
    Dans ta fonction recevant comme parametre un pointeur sur la chaine a transformer,

    Tu déclares un pointeur (char *pt)que tu initialises sur le début de ta chaîne.
    si *pt est compris entre 'a' et 'z',
    tu y rajoutes 'A'-'a'
    sinon
    si *pt est compris entre 'A' et 'Z', tu y rajoutes 'a'-'A'

    tu incrémentes ton pointeur jusqu'à ce que tu rencontre le 0 de fin de chaîne.
    Bah, non. C'est pas portable. Tu fais l'hypothèse que les valeurs des caractères sont consécutives, ce qui dépend du charset utilisé. C'est pour ça qu'il existe des fonctions de conversion dans la bibliothèque standard du C.

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 859
    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 859
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Bah, non. C'est pas portable. Tu fais l'hypothèse que les valeurs des caractères sont consécutives, ce qui dépend du charset utilisé. C'est pour ça qu'il existe des fonctions de conversion dans la bibliothèque standard du C.
    D'ailleurs ça me fait penser que si je veux convertir un caractère représentant un chiffre ('5' par exemple) en valeur numérique correspondante (5), je fais '5' - '0' (ce qui n'est évidemment pas non plus portable puisque je suppose que les caractères '0', '1', '2', '3', '4' et '5' sont consécutifs dans la table ascii). Mais j'ai pas trouvé de fonction "normalisée" pour faire l'équivalent. Quelqu'un aurait une piste ??? (mais s'il vous plaît, ne me parlez pas de "atoi()" ou "strtoul()" comme j'ai déjà vu dans ce fofo car ces fonctions prennent en entrée des chaînes et non des char)...
    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]

  10. #10
    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 Sve@r Voir le message
    D'ailleurs ça me fait penser que si je veux convertir un caractère représentant un chiffre ('5' par exemple) en valeur numérique correspondante (5), je fais '5' - '0' (ce qui n'est évidemment pas non plus portable puisque je suppose que les caractères '0', '1', '2', '3', '4' et '5' sont consécutifs dans la table ascii). Mais j'ai pas trouvé de fonction "normalisée" pour faire l'équivalent. Quelqu'un aurait une piste ??? (mais s'il vous plaît, ne me parlez pas de "atoi()" ou "strtoul()" comme j'ai déjà vu dans ce fofo car ces fonctions prennent en entrée des chaînes et non des char)...
    Dans tous les chasets que je connais, y compris EBCDIC, les caractères '0' à '9' (contrairement à 'a' - 'z' et 'A' - 'Z') sont codés de façon contigüe. J'imagine que c'est portable.

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

    +

  11. #11
    Membre Expert
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    Dans tous les chasets que je connais, y compris EBCDIC, les caractères '0' à '9' (contrairement à 'a' - 'z' et 'A' - 'Z') sont codés de façon contigüe. J'imagine que c'est portable.
    C'est meme exige par la norme du langage C.

  12. #12
    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 DaZumba Voir le message
    C'est meme exige par la norme du langage C.
    C'est bon à savoir. Je vais voir ça.

    EDIT: §5.2.1

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

    +

  13. #13
    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 Sve@r Voir le message
    D'ailleurs ça me fait penser que si je veux convertir un caractère représentant un chiffre ('5' par exemple) en valeur numérique correspondante (5), je fais '5' - '0' (ce qui n'est évidemment pas non plus portable puisque je suppose que les caractères '0', '1', '2', '3', '4' et '5' sont consécutifs dans la table ascii). Mais j'ai pas trouvé de fonction "normalisée" pour faire l'équivalent.
    Ben si, justement, c'est portable pour les chiffres décimaux (digits, ou caractères '0'-'9'), comme c'est exigé par la norme. C'est pour ça qu'il n'y a pas de fonction pour ça. L'abstraction est ici inutile.

    La bibliothèque standard du C n'est pas parfaite, mais elle donne quand même un certain nombre d'indications sur les Bonnes Pratiques...

  14. #14
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Thierry Chappuis Voir le message
    Dans tous les chasets que je connais, y compris EBCDIC, les caractères '0' à '9' (contrairement à 'a' - 'z' et 'A' - 'Z') sont codés de façon contigüe.
    Ce n'est pas le cas pour certains codes. Voir une belle collection de vieux codes: http://homepages.cwi.nl/~dik/english/codes/.

    Mais c'est plus pour l'anectode que pour autre chose. Ca n'a plus guere d'interet pratique. Et de toute facon, c'est exige par la norme C.

  15. #15
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 859
    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 859
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Ben si, justement, c'est portable pour les chiffres décimaux (digits, ou caractères '0'-'9'), comme c'est exigé par la norme.
    Chouette. Bon à savoir...

    Citation Envoyé par Emmanuel Delahaye Voir le message
    La bibliothèque standard du C n'est pas parfaite, mais elle donne quand même un certain nombre d'indications sur les Bonnes Pratiques...
    Hum... c'est un truc qu'il me faut absolument lire au plus vite...
    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]

  16. #16
    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 Sve@r Voir le message
    Hum... c'est un truc qu'il me faut absolument lire au plus vite...
    C'est pas écrit noir sur blanc. C'est en en prenant connaissance et en en comprenant les mécanismes de conception, et à force de l'utiliser avec un regard curieux et actif, qu'on parvient à en déduire un certain nombre de Bonnes Pratiques...

    Par exemple, il n'y a pas paramètre ni de retour de type char ni short. Normal, en interne ces types sont convertis en int...

  17. #17
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Par exemple, il n'y a pas paramètre ni de retour de type char ni short.
    Je ne vois aucune raison de s'imposer cette contrainte.

    Normal, en interne ces types sont convertis en int...
    Je ne vois pas a quoi tu fais allusion.

  18. #18
    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 Emmanuel Delahaye Voir le message
    Par exemple, il n'y a pas paramètre ni de retour de type char ni short. Normal, en interne ces types sont convertis en int...
    Qu'est ce qui empêche une fonction de prendre des arguments de type char ou short. Je code fonctionne parfaitement et je ne vois pas l'utilirté d'un passage par une conversion en int (même en interne):

    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>
     
    void ma_fonction(char arg1, short arg2)
    {
        printf("arg1 = %d, sizeof arg1 = %u\narg2 = %d, sizeof arg2 = %u\n",
                (unsigned char) arg1, (unsigned) sizeof arg1,
                arg2, (unsigned) sizeof arg2);
    }
     
    int main(void)
    {
        char c = 'A';
        short h = 100;
     
        ma_fonction(c, h);
     
        return 0;
    }
    Pourrais-tu préciser ta pensée?

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

    +

  19. #19
    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 Thierry Chappuis Voir le message
    Qu'est ce qui empêche une fonction de prendre des arguments de type char ou short. Je code fonctionne parfaitement et je ne vois pas l'utilirté d'un passage par une conversion en int (même en interne):
    Bien sûr que ça fonctionne, mais le code généré fait des conversions inutiles... C'est surtout un problème d'implémentation, mais suffisamment répandu pour que les gens qui ont écrit la bibliothèque n'aient pas jugé bon d'utiliser ces types.

    D'ailleurs, les compilateurs bien réglés signalent le problème...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    -Wall -Wextra -O -Wwrite-strings -Wstrict-prototypes -Wuninitialized
    -Wunreachable-code -Wconversion
    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
     
    #include <stdio.h>
     
    void f (char c)
    {
       putchar (c);
    }
     
    void g (short c)
    {
       putchar (c);
    }
     
    void h (int c)
    {
       putchar (c);
    }
     
    void i (long c)
    {
       putchar (c);
    }
     
    int main (void)
    {
       f ('A');
       g ('B');
       h ('C');
       i ('D');
     
       return 0;
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Project   : Forums
    Compiler  : GNU GCC Compiler (called directly)
    Directory : C:\dev\forums\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    main.c: In function `main':
    main.c:25: warning: passing arg 1 of `f' with different width due to prototype
    main.c:26: warning: passing arg 1 of `g' with different width due to prototype
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 0 seconds)
    0 errors, 2 warnings

  20. #20
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Switching to target: default
    Compiling: main.c
    main.c: In function `main':
    main.c:25: warning: passing arg 1 of `f' with different width due to prototype
    main.c:26: warning: passing arg 1 of `g' with different width due to prototype
    Linking console executable: console.exe
    Process terminated with status 0 (0 minutes, 0 seconds)
    0 errors, 2 warnings
    [/CODE]
    Il me semblait avoir deja explique cela. Ce warning n'a de sens que dans le cadre d'une conversion d'un programme sans prototypes a l'utilisation de prototype. La raison pour laquelle la bibliotheque standard (encore que je n'ai pas verifie pour tout ce qui a ete ajoute pour c99) ne contient pas d'occurence de promotions dans les parametres, c'est que sa conception date d'avant les prototypes...

    Ce serait assez bizarre de mettre -Wconversion en meme temps que -Wstrict-prototypes si l'equipe de gcc n'avait surcharge -Wconversion pour controler aussi un autre warning.

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Réponses: 2
    Dernier message: 18/10/2003, 14h42
  3. Chaînes de caractères
    Par Zazeglu dans le forum C
    Réponses: 3
    Dernier message: 28/08/2003, 16h20
  4. Inverser une chaîne de caractères
    Par DBBB dans le forum Assembleur
    Réponses: 2
    Dernier message: 30/03/2003, 11h09
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

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