Distinguer un caractère "lettre" d'un caractère quelconque

Distinguer un caractère "lettre" d'un caractère quelconque - C++ - Programmation

Marsh Posté le 09-04-2003 à 12:42:10    

Salut à tous,
 
j'aurais aimé utilisé la fonction toute faite "IsCharAlpha" mais comme y'a un bug dans le header winuser.h (j'utilise Visual C++), je voudrais savoir s'il existe une fct similaire permettant de savoir si un caractère est une lettre ou non.
 
Merci

Reply

Marsh Posté le 09-04-2003 à 12:42:10   

Reply

Marsh Posté le 09-04-2003 à 13:07:22    

Code :
  1. // Une petite fonction
  2. __inline char isCharAlpha(const char c) {
  3.   return ((c>='a')&&(c<='z'))||((c>='A')&&(c<='Z'));
  4. }
  5. // Ou la macro suivante :
  6. #define ISCHARALPHA(c) (((c>='a')&&(c<='z'))||((c>='A')&&(c<='Z')))
  7. // Devraient te suffire ! ;)


 
 
Attention avec l'utilisation des macros, hein ?
 
(pas de ISCHARALPHA(getch) par exemple ...)


Message édité par theshockwave le 09-04-2003 à 13:20:52
Reply

Marsh Posté le 09-04-2003 à 13:14:47    

theShOcKwAvE a écrit :

[cpp]
// Une petite fonction
__inline char isCharAlpha(const char c) {
  return ((c>='a';)&&(c<='z';))||((c>='A';)&&(c<='Z';));
}
// Ou la macro suivante :
#define ISCHARALPHA(c) (((c>='a';)&&(c<='z';))||((c>='A';)&&(c<='Z';)))
// Devraient te suffire ! ;)
[cpp]
 
 
Attention avec l'utilisation des macros, hein ?
 
(pas de ISCHARALPHA(getch) par exemple ...)
 


 
ne connaissant pas l'utilisation des macros je vais plutot utiliser la fonction  :D  
 
Par contre tu as oublié de tenir compte des lettres accentuées  ;)  
Merci quand même  :jap:

Reply

Marsh Posté le 09-04-2003 à 13:30:51    

Effectivement, mais ce ne sont que des cas particuliers à rajouter dans la liste.
 
En revanche, je ne suis pas sur que les lettres accentuées soient contigües dans toutes les tables ASCII ...
 
mais bon ... Bon courage ! ;)

Reply

Marsh Posté le 09-04-2003 à 14:01:26    

Essaye isalpha(char)

Reply

Marsh Posté le 09-04-2003 à 14:04:39    

Lancelot** a écrit :

Salut à tous,
 
j'aurais aimé utilisé la fonction toute faite "IsCharAlpha" mais comme y'a un bug dans le header winuser.h (j'utilise Visual C++), je voudrais savoir s'il existe une fct similaire permettant de savoir si un caractère est une lettre ou non.
 
Merci


 
 :lol:  :lol:  :lol:


---------------
"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 09-04-2003 à 14:07:31    

J'ai trouvé!
 
iswalpha() dans ctype.h
 
 :sol:

Reply

Marsh Posté le 09-04-2003 à 14:08:07    


 
Qu'est-ce qu'il y a de marrant?  :heink:

Reply

Marsh Posté le 09-04-2003 à 14:11:37    

Lancelot** a écrit :


 
Qu'est-ce qu'il y a de marrant?  :heink:  


 
C'est pas la peine de raconter porte nawak si tu veux qu'on t'aide... :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 09-04-2003 à 21:39:47    

Je propose une autre solution beaucoup plus rapide a l'execution si on tient compte des caractères accentués.  
Sous forme d'un tableau statique de bools contenant 256 valeurs. Une pour chaque caractère.
 
Si un caractère appartient a l'ensemble, il suffit de mettre "true" et sinon "false".
 
Apprès, on teste une caractère avec une fonction dans ce genre :
 

Code :
  1. bool IsCaractere( unsigned char c )
  2. {
  3.   return( Table[c] );
  4. }


 
voila, et c'est très rapide.
 
J'ai utilisé ce type de code pour réaliser un interpreteur Basic.
 


---------------
TOPIC PERMANENT Matrox Parhelia
Reply

Marsh Posté le 09-04-2003 à 21:39:47   

Reply

Marsh Posté le 09-04-2003 à 22:40:16    

Lancelot** a écrit :

J'ai trouvé!
 
iswalpha() dans ctype.h
 
 :sol:  

c pour les wchar

Reply

Marsh Posté le 09-04-2003 à 22:56:42    

Sr16 a écrit :

Je propose une autre solution beaucoup plus rapide a l'execution si on tient compte des caractères accentués.  
Sous forme d'un tableau statique de bools contenant 256 valeurs. Une pour chaque caractère.
 
Si un caractère appartient a l'ensemble, il suffit de mettre "true" et sinon "false".
 
Apprès, on teste une caractère avec une fonction dans ce genre :
 

Code :
  1. bool IsCaractere( unsigned char c )
  2. {
  3.   return( Table[c] );
  4. }


 
voila, et c'est très rapide.
 
J'ai utilisé ce type de code pour réaliser un interpreteur Basic.
 
 


 
C'est vrai que ca a l'air pas trop mal, comme solution ! ;)
Ca gaspilles un peu de mem, mais c'est vrai que c'est assez négligeable ! ;)

Reply

Marsh Posté le 10-04-2003 à 03:39:52    

theShOcKwAvE a écrit :


 
C'est vrai que ca a l'air pas trop mal, comme solution ! ;)
Ca gaspilles un peu de mem, mais c'est vrai que c'est assez négligeable ! ;)
 


 
256 octets, c'est pas beaucoup a côté de 1 giga de ram.
 
Et puis, ça peut resservire 10.000 fois dans le même programme.
 
Sans compter que si tu l'utilise plusieurs fois, le code généré etant beaucoup plus court que celui utilisé pour faire de multiples comparaisons, tu arrivera sûrement a gagner aussi de ce côté la.


---------------
TOPIC PERMANENT Matrox Parhelia
Reply

Marsh Posté le 10-04-2003 à 10:39:23    

C'est ce que je dis ... C'est négligeable ... :D

Reply

Marsh Posté le 10-04-2003 à 15:30:00    

theShOcKwAvE a écrit :

C'est ce que je dis ... C'est négligeable ... :D


 
Oui.
 
Tu notera que ce principe de tables peut être étendu a pas mal de choses. De la conversion de jeu de caractères a des tests d'appartenance a des ensembles.
 
Combiné avec les classes du C++, ça peut faire des trucs puissants.


---------------
TOPIC PERMANENT Matrox Parhelia
Reply

Sujets relatifs:

Leave a Replay

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