[c] Transformer une chaîne de caractères en caractères minuscules

Transformer une chaîne de caractères en caractères minuscules [c] - C++ - Programmation

Marsh Posté le 29-04-2002 à 19:15:56    

Salut !!
 
J'aimerai savoir comment transformer une chaîne de caractères en caractères minuscules non accentués. Tout caractère autre que les caractères alphabétiques doivent être remplacés par des blancs.
 
Voilà du bon pain sur la planche !
 
Merci à tous !

Reply

Marsh Posté le 29-04-2002 à 19:15:56   

Reply

Marsh Posté le 29-04-2002 à 19:44:24    

Tu parcours la chaîne caractère par caractère.
Si c'est >= que 'A' et <= que 'Z' tu fais "caractère = caractère + ('a' - 'A';)"
Sinon tu vois si c'est un accent:
switch(caractère) {
 case 'é':
 case 'É':
 case 'è':
 ...
  caractère = 'e'; break;
 case 'á':
 ...
 default:
  catactère = ' ';break;
}
 
voilà un truc qui doit marcher, mais il y a peut-être moyen de faire plus optimisé.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 29-04-2002 à 19:47:06    

il doit y avoir une petite fonction du style "tolower()" qui existe ! cherche un peu !

Reply

Marsh Posté le 29-04-2002 à 19:51:11    

LowerCase pour les AnsiString de Borland (c++) ou tolower dans la STL (C++) mais je crois qu'en C rien n'est prévu. De plus, pour le problème des accents et du remplacement des autres caractères... y a pas de solution toute faite je pense.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 01-05-2002 à 23:00:13    

Au secours, ca ne marche pas, et j'y comprends rien !! Pouvez vous m'aidez svp ?
 
Voilà ce que j'ai pour l'instant :
 
#include <stdio.h>
 
char tab[300],tabreduit[300];
 
 
char lecture(){
     int i,cpt=0;
     char nouvphrase[300];
     char choix='o';
 
     while (choix=='o';){
           printf("Veuillez entrer la phrase a saisir :\n" );
           fflush(stdin); /*vidage du buffer*/
           fgets(nouvphrase,300-strlen(tab),stdin);
           nouvphrase[strlen(nouvphrase)-1]=' '; /*remplacement du caractère de saut de ligne par un blanc*/
           strcat(tab,nouvphrase);
 
           printf("%s",tab);
 
           cpt++;
           printf("\nPhrase numero %d enregistree.",cpt);
 
           printf("\nVoulez-vous poursuivre la saisie ? (o/n) " );
           scanf("%c",&choix);
           printf("\n" );
           if (strlen(tab)>=300) return;
           }
 
     return;
}
 
 
char reduction(){
 
char car;
int i;
 
     for (i=0;i<300;i++){
         car=tab[i];
         if ((car>='A';)&&(car<='Z';)){
         car=car+('a'-'A';);
         tabreduit[i]=car;
         }
     }
     printf("%s",tabreduit);
}
 
 
main(){
     lecture();
     reduction();
}

Reply

Marsh Posté le 01-05-2002 à 23:34:46    

deja dans reduction ton for tu dois t'arrêter a la fin de la chaine:
 
for (i=0;i<300 && tab[i]>0;i++){
 
Sinon il se passe quoi exactement ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 01-05-2002 à 23:39:56    

Et bien justement, il ne se passe rien, c'est très bizarre... essaye de compiler tu verras...

Reply

Marsh Posté le 02-05-2002 à 01:16:52    

La fonction _strlwr convertit n'importe quelle string en minuscule.


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 02-05-2002 à 09:32:43    

Voilà où j'en suis :
 
void reduction(){
 
int i;
 
     for (i=0;i<300;i++){
         tabreduit[i]=tab[i];
         }
 
     strlwr(tabreduit);
 
     printf("%s",tabreduit);
 
     return;
}
 
Pourquoi ça marche pas, quelle merdouille ! Nos profs voudraient qu'on soit des pros en C alors que même eux n'y comprennent rien, c'est grave !

Reply

Marsh Posté le 02-05-2002 à 09:33:28    

antp a écrit a écrit :

LowerCase pour les AnsiString de Borland (c++) ou tolower dans la STL (C++) mais je crois qu'en C rien n'est prévu. De plus, pour le problème des accents et du remplacement des autres caractères... y a pas de solution toute faite je pense.


La fonction tolower existe en C ANSI, et dans les bonnes implémentations, elle gère les lettres accentuées en fonction de la localisation.


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 02-05-2002 à 09:33:28   

Reply

Marsh Posté le 02-05-2002 à 09:35:04    

Si tu faisais bien l'identation j'aurais vu tout de suite l'erreur:
 

Code :
  1. for (i=0;i<300;i++){
  2.     car=tab[i];
  3.     if ((car>='A')&&(car<='Z')){
  4.     car=car+('a'-'A');
  5.     tabreduit[i]=car;
  6.     }


 
tabreduit[i]=car ne doit pas être dans le if, donc :
 

Code :
  1. for (i=0;i<300;i++)
  2. {
  3.    car=tab[i];
  4.    if ((car>='A')&&(car<='Z'))
  5.    {
  6.       car=car+('a'-'A');
  7.    }
  8.    tabreduit[i]=car;
  9. }


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 02-05-2002 à 09:37:22    

Jar Jar a écrit a écrit :

La fonction tolower existe en C ANSI, et dans les bonnes implémentations, elle gère les lettres accentuées en fonction de la localisation.  




 
Oui mais même si la fonction existe étant donné qu'il doit quand même virer les autres caractères et remplacer les accents, autant qu'il le fasse dans une boucle :/
Dans l'aide de Borland ils parlent pas d'accents (je sais, tu as dit que c'était que dans les bonnes implémentations :D)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 02-05-2002 à 09:39:30    

Oki, c'est fait, mais il affiche pas le résultat, comment faire une pause après l'écriture du tableau, pour ne pas qu'il ferme la fenêtre ?
 
void reduction(){
 
char car;
int i;
 
     for (i=0;i<300;i++){
         car=tab[i];
         if ((car>='A';)&&(car<='Z';)){
            car=car+('a'-'A';);
            }
         tabreduit[i]=car;
         }
 
     printf("%s",tabreduit);
 
     return;
}

Reply

Marsh Posté le 02-05-2002 à 09:42:24    

main(){
  lecture();
  reduction();
  fflush(stdin);
  getchar(); /* il faudra appuyer sur Enter pour quitter */
}


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 02-05-2002 à 09:49:14    

C'est bon ça marche, merci beaucoup !!! Il ne reste plus qu'à traiter le cas des accents !

Reply

Marsh Posté le 02-05-2002 à 10:23:06    

Euh... c'est encore moi... car marche comment les switch case ?
 
Voilà où j'en suis :
 
void reduction(){
 
char car;
int i;
 
     for (i=0;i<300;i++){
 
         car=tab[i];
 
         switch (car){
            case 'é': car='e'; break;
            case 'É': car='e'; break;
            case 'è': car='e'; break;
            case 'È': car='e'; break;
            case 'ê': car='e'; break;
            case 'Ê': car='e'; break;
            case 'ë': car='e'; break;
            case 'Ë': car='e'; break;
 
            case 'î': car='i'; break;
            case 'Î': car='i'; break;
            case 'ï': car='i'; break;
            case 'Ï': car='i'; break;
            car='i'; break;
 
            case 'à': car='a'; break;
            case 'À': car='a'; break;
            case 'â': car='a'; break;
            case 'Â': car='a'; break;
            car='a'; break;
            }
 
         if ((car>='A';)&&(car<='Z';)){
            car=car+('a'-'A';);
            }
         tabreduit[i]=car;
         }
 
     printf("%s",tabreduit);
 
     return;
}

Reply

Marsh Posté le 02-05-2002 à 10:35:01    

antp a écrit a écrit :

Dans l'aide de Borland ils parlent pas d'accents (je sais, tu as dit que c'était que dans les bonnes implémentations :D)


Le problème avec les accents, c'est que pour les gérer dans toutes les langues, il faut utiliser les locales, et que les locales, c'est POSIX (et à moins que ça ait changé, Windows n'a aucun mécanisme de localisation).


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 02-05-2002 à 10:41:56    

Allez antp, tu vas bien nous trouver une solution ! :hap:

Reply

Marsh Posté le 02-05-2002 à 10:48:17    

SMGFAN a écrit a écrit :

Allez antp, tu vas bien nous trouver une solution ! :hap:  




 
Je suis pas en permanence sur le forum :o
Je bosse, moi :p
 

Code :
  1. for (i=0;i<300;i++){
  2.          car=tab[i];
  3.          if ((car>='A')&&(car<='Z'))
  4.          {
  5.             car=car+('a'-'A');
  6.          }
  7.          else
  8.             switch (car)
  9.             {
  10.                case 'é':
  11.                case 'É':
  12.                case 'è':
  13.                case 'È':
  14.                case 'ê':
  15.                case 'Ê':
  16.                case 'ë':
  17.                case 'Ë': car='e'; break;
  18.                case 'í':
  19.                case 'Í':
  20.                case 'ì':
  21.                case 'Ì':
  22.                case 'î':
  23.                case 'Î':
  24.                case 'ï':
  25.                case 'Ï': car='i'; break;
  26.                case 'ä':
  27.                case 'Ä':
  28.                case 'ã':
  29.                case 'Ã':
  30.                case 'á':
  31.                case 'Á':
  32.                case 'à':
  33.                case 'À':
  34.                case 'â':
  35.                case 'Â': car='a'; break;
  36.                case 'ü':
  37.                case 'Ü':
  38.                case 'ú':
  39.                case 'Ú':
  40.                case 'ù':
  41.                case 'Ù':
  42.                case 'û':
  43.                case 'Û': car='u'; break;
  44.                case 'ö':
  45.                case 'Ö':
  46.                case 'ó':
  47.                case 'Ó':
  48.                case 'ò':
  49.                case 'Ò':
  50.                case 'ô':
  51.                case 'Ô': car='o'; break;
  52.                case 'ý':
  53.                case 'Ý':
  54.                case 'ÿ': car='y'; break;           
  55.                case 'ñ':
  56.                case 'Ñ': car='n'; break;
  57.                case 'ç':
  58.                case 'Ç': car='c'; break;
  59.             }
  60.          tabreduit[i]=car;
  61.          }


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 02-05-2002 à 11:02:24    

Jar Jar a écrit a écrit :

Le problème avec les accents, c'est que pour les gérer dans toutes les langues, il faut utiliser les locales, et que les locales, c'est POSIX (et à moins que ça ait changé, Windows n'a aucun mécanisme de localisation).  




Ou passer par de l'unicode et utiliser ICU.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 02-05-2002 à 12:52:44    

gilou a écrit a écrit :

Ou passer par de l'unicode et utiliser ICU.


Yop.
Cela dit, l'unicode en C, je n'ai pas essayé, mais ça n'a pas l'air formidable par rapport à ce qui se fait dans d'autres langages.


---------------
« No question is too silly to ask, but, of course, some are too silly to answer. » -- Perl book
Reply

Marsh Posté le 02-05-2002 à 13:45:08    

antp a écrit a écrit :

 
 
Je suis pas en permanence sur le forum :o
Je bosse, moi :p
 

Code :
  1. for (i=0;i<300;i++){
  2.          car=tab[i];
  3.          if ((car>='A')&&(car<='Z'))
  4.          {
  5.             car=car+('a'-'A');
  6.          }
  7.          else
  8.             switch (car)
  9.             {
  10.                case 'é':
  11.                case 'É':
  12.                case 'è':
  13.                case 'È':
  14.                case 'ê':
  15.                case 'Ê':
  16.                case 'ë':
  17.                case 'Ë': car='e'; break;
  18.                case 'í':
  19.                case 'Í':
  20.                case 'ì':
  21.                case 'Ì':
  22.                case 'î':
  23.                case 'Î':
  24.                case 'ï':
  25.                case 'Ï': car='i'; break;
  26.                case 'ä':
  27.                case 'Ä':
  28.                case 'ã':
  29.                case 'Ã':
  30.                case 'á':
  31.                case 'Á':
  32.                case 'à':
  33.                case 'À':
  34.                case 'â':
  35.                case 'Â': car='a'; break;
  36.                case 'ü':
  37.                case 'Ü':
  38.                case 'ú':
  39.                case 'Ú':
  40.                case 'ù':
  41.                case 'Ù':
  42.                case 'û':
  43.                case 'Û': car='u'; break;
  44.                case 'ö':
  45.                case 'Ö':
  46.                case 'ó':
  47.                case 'Ó':
  48.                case 'ò':
  49.                case 'Ò':
  50.                case 'ô':
  51.                case 'Ô': car='o'; break;
  52.                case 'ý':
  53.                case 'Ý':
  54.                case 'ÿ': car='y'; break;           
  55.                case 'ñ':
  56.                case 'Ñ': car='n'; break;
  57.                case 'ç':
  58.                case 'Ç': car='c'; break;
  59.             }
  60.          tabreduit[i]=car;
  61.          }

 




 
bah y'a un tit soucis... les accents ne sont pas supprimés...

Reply

Marsh Posté le 02-05-2002 à 14:27:03    

Pas besoin de quoter tout le post pour ça...
 
Bhen je sais pas pourquoi ça marche pas... Faut chercher.


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 02-05-2002 à 14:32:01    

Bah je sais bien qu'il faut chercher, mais j'y connais pas grand chose :) C'est pour ça que j'essayer de trouver des infos sur le forum...

Reply

Marsh Posté le 02-05-2002 à 16:33:37    

antp a écrit a écrit :

 
 
Je suis pas en permanence sur le forum :o
Je bosse, moi :p
 

Code :
  1. ....

 




 
C'était interdit d'utiliser un tableau ?  :sarcastic:


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 02-05-2002 à 16:50:31    

Tableau de quoi ?


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 02-05-2002 à 16:55:31    

antp a écrit a écrit :

Tableau de quoi ?  




 
Ben... un tableau de correspondance plutôt que d'executer un énorme copier-coller de switch/case tout vilain pour ne faire, en plus, qu'une simple affectation.
 
Avec un truc du style :
 
char correspondance[] = "éÉèÈêÊëËíÍìÌîÎïÏ";
char lowercase[] = "eeeeeeeeiiiiiiii";
 
etc... Ca présente l'avantage d'être facilement modifiable.

 

[jfdsdjhfuetppo]--Message édité par Tetragrammaton IHVH le 02-05-2002 à 17:16:33--[/jfdsdjhfuetppo]


---------------
"Dieu a exploité tous nos complexes d'infériorité, en commençant par notre incapacité de croire à notre propre divinité." - Emil Michel Cioran
Reply

Marsh Posté le 02-05-2002 à 17:48:09    

Heu ouais :D
J'y avais pas pensé :o
Enfin j'ai pas tellement réfléchi non plus :ange:


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 29-05-2002 à 15:52:30    

SMGFAN a écrit a écrit :

 
 
bah y'a un tit soucis... les accents ne sont pas supprimés...  




 
<Private Joke ON> Mais t'inquiete pas, tu l'auras pas ton LO22 !!! <Private Joke OFF>

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed