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 :

Fonction de conversion d'un chaîne en majuscule


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2010
    Messages : 63
    Par défaut Fonction de conversion d'un chaîne en majuscule
    Bonjour
    J'ai un souci avec ma fonction de conversion de chaîne de caractères en majuscule.
    Je souhaite convertir tout texte saisi en texte en majuscules non accentuées pour faciliter les traitements ultérieurs (je ne souhaite pas utiliser les wchar).

    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
     
     
    void conv_maj(unsigned char chaine[])
    {
    int i;
     
      for (i=0; i<strlen(chaine); i++)
      {
      	if(chaine[i] >= 'a' && chaine[i] <= 'z')
      	{
    		chaine[i] = toupper(chaine[i]);
    	}
     
    	else
    	{
    		switch (chaine[i])
    		{
    		   case (unsigned char) 'à': case (unsigned char) 'â': case (unsigned char) 'ä' : chaine[i] ='A' ;
    		   				  break;
    		   case (unsigned char) 'ç' : chaine[i] ='C' ;
    		   	      break;
     
    		   case (unsigned char) 'é' : case (unsigned char) 'è' : case (unsigned char) 'ê' : case (unsigned char) 'ë' : chaine[i] ='E' ;
    		   					       break;
     
    		   case (unsigned char) 'î' : case (unsigned char) 'ï' : chaine[i] ='I';
    		   			 break;
     
    		   case (unsigned char) 'ô' : case (unsigned char) 'ö' : chaine[i] = 'O' ;
    		  			 break;
     
    		   case (unsigned char) 'ù' : case (unsigned char) 'û' : case (unsigned char) 'ü' : chaine[i]  = 'U' ;
    		   				    break;
    		   default : break;
    		}
    	}
     
      }
    }
    J'obtiens des caractères bizarroïdes .

  2. #2
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Ton problème vient du fait que les caractères accentués sont codés sur deux char (affiche le résultat de "strlen(chaine)") du coup tu obtiens des caractères "bizarroïdes" "en plus" si tu réécrits char par char.

  3. #3
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2010
    Messages : 63
    Par défaut
    Citation Envoyé par pythéas Voir le message
    Ton problème vient du fait que les caractères accentués sont codés sur deux char (affiche le résultat de "strlen(chaine)") du coup tu obtiens des caractères "bizarroïdes" "en plus" si tu réécrits char par char.
    Merci pour ta réponse
    Mais du coup, comment dois-je procéder ?

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    La solution la plus simple me semble être de mettre le résultat dans une nouvelle chaîne.

    Pour te donner une idée, un code vite fait (et donc pas très propre) à partir du tien :

    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
    char* conv_maj_nvl_chaine(unsigned char chaine[])
    {
     
     
    int i , j =0;
    char *chaine2 = strdup(chaine);
     
      for (i=0; i<strlen(chaine); i++)
    		    {
    	if(chaine[i] >= 'a' && chaine[i] <= 'z')
    	{
    		chaine[i] = toupper(chaine[i]);
    		chaine2[j] = toupper(chaine[i]);
    		j++;
    	}
    	else
    	{
    		switch (chaine[i])
    		{
    case (unsigned char) 'à': case (unsigned char) 'â': case (unsigned char) 'ä' : chaine2[j-1] ='A' ;
    		   break;
    		   case (unsigned char) 'ç' : chaine2[j-1] ='C' ;
    		   break;   
          		   case (unsigned char) 'é' : case (unsigned char) 'è' : case (unsigned char) 'ê' : case (unsigned char) 'ë' : chaine2[j-1] ='E';
    		   break;
          		   case (unsigned char) 'î' : case (unsigned char) 'ï' : chaine2[j-1] ='I';
      		   break;
    		   case (unsigned char) 'ô' : case (unsigned char) 'ö' : chaine2[j-1] = 'O' ;
    		   break;
    		   case (unsigned char) 'ù' : case (unsigned char) 'û' : case (unsigned char) 'ü' : chaine2[j-1]  = 'U' ;
    		   break;
    		   default : chaine2[j] =chaine[i]; j++; break;
    		}
    	}
     }
     
    chaine2[j] = '\0';
     
    printf("\n la nvl chaine : %s\n",chaine2);
     
    return chaine2;
    }
    encore une fois c'est pas à reprendre tel quel mais ça peut te donner une idée

  5. #5
    Membre Expert
    Avatar de kwariz
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Octobre 2011
    Messages
    898
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2011
    Messages : 898
    Par défaut
    Salut,

    en fait pour commencer (il me semble que tu es sous linux), dans un terminal tu fais :
    Cela va te donner l'encodage utilisé pour les saisies. Si tu as UTF-8, tu vas te retrouver avec certains caractères (=1 symbole affiché) codé sur plusieurs octets (=char en c, la confusion commence). Si tu as ISO8859, tu es sûr d'avoir tous tes caractères encodés avec un octet (dans ce cas 1 symbole=1 char).
    Dans le premier cas tu ne pourras jamais écrire
    car tu essayes de mettre plus d'un octet dans une variable qui ne peut en contenir qu'un. Dans le second cas il n'y aura pas de problèmes.

    C avec les fonctions de bases (strXXX) ne fonctionne vraiment bien qu'avec le second cas et totalement bien avec un encodage ASCII-US (il a été "prévu pour").

    N'oublie pas de tester que le paramètre n'est pas NULL avant de commencer le traitement. Tu peux utiliser les fonctionnalités isalpha, islower, isupper pour savoir à quel genre de caractère tu as à faire.

  6. #6
    Membre chevronné

    Profil pro
    Inscrit en
    Août 2007
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 179
    Par défaut
    Oui, effectivement, compte tenu de ton erreur, je suis parti du principe que tu étais en UT8 mais comme le rapelle kwariz il convient de vérifier.
    Si jamais tu es en ISO (ce qui, toutefois, me surprendrais) tout ce que j'ai racconté n'a aucun intérêt.

  7. #7
    Membre confirmé
    Femme Profil pro
    Étudiant
    Inscrit en
    Décembre 2010
    Messages
    63
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2010
    Messages : 63
    Par défaut
    Citation Envoyé par kwariz Voir le message
    Salut,

    en fait pour commencer (il me semble que tu es sous linux), dans un terminal tu fais :
    Cela va te donner l'encodage utilisé pour les saisies. Si tu as UTF-8, tu vas te retrouver avec certains caractères (=1 symbole affiché) codé sur plusieurs octets (=char en c, la confusion commence). Si tu as ISO8859, tu es sûr d'avoir tous tes caractères encodés avec un octet (dans ce cas 1 symbole=1 char).
    Dans le premier cas tu ne pourras jamais écrire
    car tu essayes de mettre plus d'un octet dans une variable qui ne peut en contenir qu'un. Dans le second cas il n'y aura pas de problèmes.

    C avec les fonctions de bases (strXXX) ne fonctionne vraiment bien qu'avec le second cas et totalement bien avec un encodage ASCII-US (il a été "prévu pour").

    N'oublie pas de tester que le paramètre n'est pas NULL avant de commencer le traitement. Tu peux utiliser les fonctionnalités isalpha, islower, isupper pour savoir à quel genre de caractère tu as à faire.
    Merci beaucoup pour ton explication. Je suis sous Linux et manque de bol, je suis su rune encodage de type UTF8

Discussions similaires

  1. Fonction de conversion de nombre en lettres
    Par david_chardonnet dans le forum Langage
    Réponses: 21
    Dernier message: 08/12/2021, 17h51
  2. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  3. Réponses: 6
    Dernier message: 14/02/2007, 20h00
  4. Réponses: 5
    Dernier message: 12/01/2005, 20h58
  5. Fonction de conversion de COLORREF en hexadécimal?
    Par charliejo dans le forum MFC
    Réponses: 4
    Dernier message: 21/02/2004, 18h25

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