Transformer une chaîne de caractères en caractères minuscules [c] - C++ - Programmation
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é.
Marsh Posté le 29-04-2002 à 19:47:06
il doit y avoir une petite fonction du style "tolower()" qui existe ! cherche un peu !
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.
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();
}
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 ?
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...
Marsh Posté le 02-05-2002 à 01:16:52
La fonction _strlwr convertit n'importe quelle string en minuscule.
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 !
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.
Marsh Posté le 02-05-2002 à 09:35:04
Si tu faisais bien l'identation j'aurais vu tout de suite l'erreur:
Code :
|
tabreduit[i]=car ne doit pas être dans le if, donc :
Code :
|
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 )
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;
}
Marsh Posté le 02-05-2002 à 09:42:24
main(){
lecture();
reduction();
fflush(stdin);
getchar(); /* il faudra appuyer sur Enter pour quitter */
}
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 !
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;
}
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).
Marsh Posté le 02-05-2002 à 10:48:17
SMGFAN a écrit a écrit : Allez antp, tu vas bien nous trouver une solution ! |
Je suis pas en permanence sur le forum
Je bosse, moi
Code :
|
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+,
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.
Marsh Posté le 02-05-2002 à 13:45:08
antp a écrit a écrit : Je suis pas en permanence sur le forum Je bosse, moi
|
bah y'a un tit soucis... les accents ne sont pas supprimés...
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.
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...
Marsh Posté le 02-05-2002 à 16:33:37
antp a écrit a écrit : Je suis pas en permanence sur le forum Je bosse, moi
|
C'était interdit d'utiliser un tableau ?
Marsh Posté le 02-05-2002 à 16:50:31
Tableau de quoi ?
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]
Marsh Posté le 02-05-2002 à 17:48:09
Heu ouais
J'y avais pas pensé
Enfin j'ai pas tellement réfléchi non plus
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>
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 !