Se connecter / S'enregistrer
Votre question

>RESOLU<[C] fonction qui recherche une chaine de caractères dans une autre

Tags :
  • chaine
  • Programmation
Dernière réponse : dans Programmation
25 Mars 2006 13:23:48

Bonjour à tous !

J'aimerais savoir qu'elle fonction peut rechercher une chaine de caractères dans une autre mais en ignorant les majuscules/minuscules.

Par exemple, la recherche de "Manger des PommeS" dans "J'aime manGer DES pommes" devra être fructueuse.

Pourvez-vous me donner le nom d'une fonction comme celle-ci ?

PS : ne me proposez pas la fonction strstr(); car c'est celle que j'utilise et elle prend en compte les minuscule/majuscule.

PS² : une fonction qui ignore en plus les accents serait encore mieu ;-)

Autres pages sur : resolu fonction recherche chaine caracteres

a b L Programmation
25 Mars 2006 13:31:26

Quel compilateur ?
Pour les majuscules, tu peux tout transformer en majuscules et faire le strstr().
Pour les majuscules, tu as toupper() sur un caractère (local routine (je sais pas comment on dis en fr)) donc peut-être que ça marche pour les accents
25 Mars 2006 13:41:17

Tu pourrais transformer en nombre comme sa tu n' aurais plus de probleme de majuscules ni d' accents.

Tu aura plus qu' a comparer des nombres.
Contenus similaires
25 Mars 2006 17:02:58

Citation :

CRicky a écrit :
Quel compilateur ?
Pour les majuscules, tu peux tout transformer en majuscules et faire le strstr().
Pour les majuscules, tu as toupper() sur un caractère (local routine (je sais pas comment on dis en fr)) donc peut-être que ça marche pour les accents


Mon compilateur est GCC.
Et il n'y a pas de fonction qui font l'inverse de toupper ? (qui mettent en minuscule)


Citation :

Tu pourrais transformer en nombre comme sa tu n' aurais plus de probleme de majuscules ni d' accents.

Tu aura plus qu' a comparer des nombres.

Je te suis pas là !
Je veux pas comparer mais rechercher des chaines de caractère et si je prends le code ASCII ou les octets de caractères : ils ne seront pas les mêmes.
a b L Programmation
25 Mars 2006 17:47:35

Citation :
Et il n'y a pas de fonction qui font l'inverse de toupper ? (qui mettent en minuscule)

tolower() ;-)

26 Mars 2006 16:29:56

merci ! ;-)
28 Mars 2006 16:21:03

Argh ! ça marche pas ! :-o
tolower(); ne touche pas au accent et toupper(); non plus !

Quelqu'un peux m'aider ?

PS : j'ai essayer :
  1. if(chaine[i] == 'é')
  2. chaine[i] = 'e'
  3. etc...

Mais ça marche pas ! Le programme ne rentre pas dans la condition !
J'ai déjà eu ce type de problème.
Il doit bien exister une fonction...
28 Mars 2006 18:43:36

Salut
tu irais plus vite a faire toi même la fonction qui remplace les accents en plus c'est pas super long a faire
a b L Programmation
28 Mars 2006 19:32:18

Attention au 'é' !
il est codé différemment en ASCII et en latin-1 (ISO 8859-1).
Si tu es sous windows et que tu tapes 'é' dans ton éditeur, tu vas avoir l'encodage latin-1 ('é' == 0xE9).
Si ensuite, tu compares avec un 'é' qui serait tapé dans une console DOS (qui utilise l'encodage ASCII), tu auras 'é' == 0x82.
Donc quand tu compares, tu fais le test: 0xE9 == 0x82 qui est évidemment faut.
28 Mars 2006 20:19:36

Et comment trouver une table de correspondance pour tous les autres accents ?


EDIT : Trouvé !
http://www.table-ascii.com/


Mais comment-faire mes comparaison maintenant ?
Et, dans le site, é = E9 C'est ça valeur en hexadécimal... Toi tu dit é = 0xE9 :-o
Je comprend plus rien ! :-D


Tu peux m'aider ?
28 Mars 2006 20:40:46

0x en C ca indique que l'on utilise la notation hexadécimale pour un entier... Donc 0xE9 c'est E9, mais pour le C.
Comme pour un nombre précédé par 0 pour le mettre en octal
28 Mars 2006 20:53:25

Merci ! ;-)

Je vais voir si ça marche !

EDIT :
Marche pas ! :-(

J'ai essayé de déclaré chaine[200] en char, unsigned char, et long; dans tous les cas ça marche pas.
je fait :
  1. if(chaine[i] == '0xE9')
  2. chaine[i] = 'e';



Vous pouvez m'aider ?
28 Mars 2006 22:28:12

Et si tu affiches chaine quand ce caractère est un 'é', ca donne quoi ? ( printf( "%x", chaine ) )
a b L Programmation
28 Mars 2006 23:26:52

Citation :

aerocell a écrit :
Merci ! ;-)

Je vais voir si ça marche !

EDIT :
Marche pas ! :-(

J'ai essayé de déclaré chaine[200] en char, unsigned char, et long; dans tous les cas ça marche pas.
je fait :
  1. if(chaine[i] == '0xE9')
  2. chaine[i] = 'e';



Vous pouvez m'aider ?

Tu as mis le 0xE9 entre quote, il ne faut pas, 0xE9 c'est un nombre égal à 233.
Donc soit tu mets:
  1. if(chaine[i] == 0xE9)
  2. chaine[i] = 'e';


soit tu mets:
  1. if(chaine[i] == 233)
  2. chaine[i] = 'e';

29 Mars 2006 12:22:45

ça marche toujours pas !

L'erreur : "28 [Warning] comparison is always false due to limited range of data type "
est citée de la ligne 26 à 32


Voilà mon code en entier :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4.  
  5.  
  6.  
  7. int main(int argc, char *argv[])
  8. {
  9. char chaine[200] = {0};
  10. long i = 0, longueurChaine = 0;
  11.  
  12.  
  13. fgets(chaine, 200, stdin);
  14.  
  15. longueurChaine = strlen(chaine);
  16. do
  17. {
  18. printf("%x\n", chaine[i]);
  19.  
  20. chaine[i] = tolower(chaine[i]);
  21.  
  22. printf("%c\n", chaine[i]);
  23.  
  24. if(chaine[i] == '\n')
  25. chaine[i] = 0;
  26. else if(chaine[i] == 0xE9 || chaine[i] == 'è' || chaine[i] == 'ê' || chaine[i] == 'ë')
  27. chaine[i] = 'e';
  28. else if (chaine[i] == 'à' || chaine[i] == 'â' ||chaine[i] == 'à' || chaine[i] == 'ä')
  29. chaine[i] = 'a';
  30. else if (chaine[i] == 'î' || chaine[i] == 'ï')
  31. chaine[i] = 'i';
  32. else if (chaine[i] == 'ô' || chaine[i] == 'ö')
  33. chaine[i] = 'o';
  34.  
  35. i++;
  36. }while(i <= longueurChaine);
  37.  
  38. printf(" chaine = \"%s\"\n", chaine);
  39.  
  40.  
  41. system("PAUSE");
  42. return 0;
  43. }


Et ça marche pas même quand je déclare chaine en unsigned char ou en long.
29 Mars 2006 17:38:05

En trifouillant un peu j'ai trouvé que 0x82 = 'é' en ASCII et quand je met un printf ça passe (le caractère 'é' s'affiche) mais pas avec 0xE9 ça donne un 'Ú'.
Mais dans la condition ça foire toujours ! :-?
29 Mars 2006 18:24:42

J'ai trouvé ! il suffit de mettre la valeur décimale du caractère ! é = -126 !

Mais j'ai un nouveau problème :
Ma fonction ne fonctionne pas quand la chaine de caractère provient d'un fichier, comment faire ?

PS : mon fichier est un txt écrit "à la main" avec notepad. (donc il contient des 'é' et pas des '...' et autres caractères bizares)
29 Mars 2006 18:39:23

J'ai trouvée aussi ! lol

Il suffit là encore de prendre la valeur décimale mais celle-ci est differente des précèdentes.
(ça vient du codage du fichier je pense mais je suis pas un pro dans ce domaine)
Donc é = -23
a b L Programmation
29 Mars 2006 19:19:51

Oui notepad étant sous windows, il encode les caractères en Latin-1 (comme le code source).
Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS