Se connecter avec
S'enregistrer | Connectez-vous

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

Dernière réponse : dans Programmation

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 ;-)
Lassé par la pub ? Créez un compte
Expert Programmation

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

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.

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...
Expert Programmation

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.

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 ?
Expert Programmation

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';

ç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.

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)

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
Lassé par la pub ? Créez un compte
Tom's guide dans le monde