Tom's Guide > Forum > Programmation > >RESOLU<[C] fonction qui recherche une chaine de caractères dans une autre

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

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

TomsGuide.com : 800 000 inscrits répondent à toutes vos questions high-tech et informatique. Pour obtenir de l'aide, inscrivez-vous gratuitement !
Mot :    Pseudo :           
 

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

Liens sponsorisés
Inscrivez-vous ou connectez-vous pour masquer ceci.

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

Répondre à CRicky

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.

Répondre à Sn00bino_Petrolking

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.

Répondre à aerocell

Citation :

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


tolower() ;-)

Répondre à CRicky

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

Quelqu'un peux m'aider ?

PS : j'ai essayer :

Code :
  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...

Répondre à aerocell

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

Répondre à showie

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.

Répondre à CRicky

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 ?

Répondre à aerocell

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

Répondre à Rakipu

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 :

Code :
  1. if(chaine[i] == '0xE9')
  2. chaine[i] = 'e';




Vous pouvez m'aider ?

Répondre à aerocell

Et si tu affiches chaine[i] quand ce caractère est un 'é', ca donne quoi ? ( printf( "%x", chaine[i] ) )

Répondre à ritzle

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 :

Code :
  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:

Code :
  1. if(chaine[i] == 0xE9)
  2.   chaine[i] = 'e';



soit tu mets:

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


Répondre à CRicky

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

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



Et ça marche pas même quand je déclare chaine en unsigned char ou en long.

Répondre à aerocell

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 ! :-?

Répondre à aerocell

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)

Répondre à aerocell

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

Répondre à aerocell

Oui notepad étant sous windows, il encode les caractères en Latin-1 (comme le code source).

Répondre à CRicky
Tom's Guide > Forum > Programmation > >RESOLU<[C] fonction qui recherche une chaine de caractères dans une autre
Aller à :

Il y a 656 utilisateurs connus et inconnus. Pour voir la liste des connectés connus, cliquez ici.

Attention

Vous allez répondre sur un sujet resté inactif pendant plus de 6 mois.
Assurez-vous d'apporter des éléments nouveaux à la discussion avant de poursuivre.

Répondre Annuler
Liens