Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Fonction qui trouve une chaine de caractere dans une autre ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#1 Message par Jérémy » sam. 20 janv. 2018 12:42

Bonjour à tous,

Sous mikroC connaissez vous l’existence d'une fonction qui cherche une chaine de caractère dans une autre chaine de caractère et qui renvoie par exemple "1" si le texte est trouvé ou "0" si le texte n'est pas trouvé.

Le but est d'enregistré dans un buffer par UART, les réponses d'un module ou le texte recu.

Ensuite je cherche du texte dans ce buffer par exemple le mot "OK" .

J'ai vu dans l'aide de mikroC les fonctions "strxxx" , mais aucune ne convient ou alors j'ai pas compris comment les utiliser .
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Fonction qui trouve une chaine de caractere dans une autre ?
pspic
Passioné
Passioné
Messages : 357
Âge : 77
Enregistré en : septembre 2017
Localisation : 68

#2 Message par pspic » sam. 20 janv. 2018 19:04

Bonjour,
Essaye la fonction StrStr (voir string library), pour trouver la première occurrence de la chaine recherchée.
Si la fonction retourne une valeur <> 0 alors la chaine recherchée est incluse.

Code : Tout sélectionner

Function locates the first occurrence of the string s2 in the string s1 (excluding the terminating null character).
The function returns pointer to first occurrence of s2 in s1; if no string was found, function returns 0. If s2 is a null string, the function returns 0.
Example    
char txt = "mikroElektronika";
char txt_sub = "mikro";
char *res;
res = strstr(txt,txt_sub);

Pour MikroBasic il existe dans Libstock une énorme librairie StrngUtils_P18 contenant 136 fonctions pour la manipulation des chaines, regarde si il n'existe pas l'équivalent pou Mikroc

Fonction qui trouve une chaine de caractere dans une autre ?
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#3 Message par paulfjujo » sam. 20 janv. 2018 20:59

bonsoir Jeremy,

exemple:
pour recupere une commande via BlueTooth Android
cde d'une LED et valeur d'un curseur

avec
buffer1 = buffer reception UART1
unsigned char *p1;


Code : Tout sélectionner


 p1
=strstr(buffer1,"CD1=");   // etat commande #1 from BLE
           if (p1>0)
        {
          if (*(p1+4)=='1')
          {
            // UART1_Write_CText("S1=0\r\n");   // retour d'ordre
             Relay1=ON;
             UART3_Write_CText(" Relay1_ON\r\n");
          }
          if (*(p1+4)=='0')
          {
           // UART1_Write_CText("S1=1\r\n");
            Relay1=OFF;
            UART3_Write_CText(" Relay1_OFF\r\n");
          }
        }
              
       p1
=strstr(buffer1,"SL=");
       if (p1>0)
        {  *(p1+6)=0;
          // UART3_Write_Text(p1);
          // UART3_Write(TAB);
          // UART3_Write_Text(p1+3);
          // UART3_Write(TAB);
          Curseur=atoi(p1+3);
          UART3_Write_CText("\r\n Curseur=");
          IntToStr(Curseur,CRam1);
           UART3_Write_Text(CRam1);
          CRLF3();
          }
Aide toi, le ciel ou FantasPic t'aidera

Fonction qui trouve une chaine de caractere dans une autre ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#4 Message par Jérémy » dim. 21 janv. 2018 14:34

Merci à tout les deux,

@ PAul : j'ai vraiment du mal avec les pointeurs , du coup je comprends rien a ton bout de code :cry:

@PSPIC : A essayer , mais je ne comprends pas trop . SI il trouve la première occurrence de la chaine recherchée , mais toute la chaine ?

Ce serait donc un bon moyen si c'est le cas . SI la valeur est différente de 0 alors c'est que ma chaine est présente .
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Fonction qui trouve une chaine de caractere dans une autre ?
Claudius
Avatar de l’utilisateur
Passioné
Passioné
Messages : 260
Âge : 69
Enregistré en : septembre 2015
Localisation : ELANCOURT (78 - YVELINES)
Contact :

#5 Message par Claudius » dim. 21 janv. 2018 17:35

Bonjour et Bonne Année 2018,

@Jérémy qui a écrit: j'ai vraiment du mal avec les pointeurs...

Comme ce n'est pas la 1st fois que je lis tes difficultés avec peut-être la chose la plus ardue à appréhender en Langage C, je te conseille de les mettre en oeuvre hors contexte des PICs (sous Windows et/ou Linux au sein de petits programmes) en suivant mot à mot des cours du genre Apprendre à programmer les pointeurs en C (*)

Pour ladite fonction, c'est effectivement strstr() ;-)

(*) Cette méthode permet d'aller 100 fois plus vite dans la compréhension d'un concept, reste après à l'utiliser dans l'environnement ad hoc...


Cordialement, A+
--
Claudius

Fonction qui trouve une chaine de caractere dans une autre ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#6 Message par Jérémy » dim. 21 janv. 2018 20:00

Bonsoir Claudius,

très sage ton conseil, que de m’éloigner de mon programme principal, pour essayer une fonction ou apprendre les pointeurs.... HORS PICS .
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Fonction qui trouve une chaine de caractere dans une autre ?
pspic
Passioné
Passioné
Messages : 357
Âge : 77
Enregistré en : septembre 2017
Localisation : 68

#7 Message par pspic » mar. 23 janv. 2018 11:22

Jérémy a écrit :@PSPIC : A essayer , mais je ne comprends pas trop . SI il trouve la première occurrence de la chaine recherchée , mais toute la chaine ?
Ce serait donc un bon moyen si c'est le cas . SI la valeur est différente de 0 alors c'est que ma chaine est présente .

Si la fonction retourne une valeur <> 0, c'est que la chaine recherchée a été trouvée.

Exemple:
Chaine à explorer: FANTASPICESTFANTASTIQUE soit C1
Chaine recherchée: PIC soit C2

F A N T A S P I C E S T F A N T A S T I Q U E
0 1 2 3 4 5 6 7 8 9 10 11 12

La fonction StrStr(C1,C2) retourne 6.

Fonction qui trouve une chaine de caractere dans une autre ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#8 Message par Jérémy » mar. 23 janv. 2018 12:04

Merci pour cet exemple parlant ! ( phrase très bien choisie par ailleurs :wink: )

Mais si je comprends bien, il me semble que cela devrait être plutôt

F A N T A S P I C E S T F A N T A S T I Q U E
1 2 3 4 5 6 7 8 9 10 11 12

Car le "0" est réservé si la chaine recherchée n'est pas trouvé non ?

En tout cas si c'est ca , la méthode est trés celle qui me conviendrait Merci !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Fonction qui trouve une chaine de caractere dans une autre ?
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 2589
Âge : 73
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#9 Message par paulfjujo » mar. 23 janv. 2018 13:40

bonjour à Tous,



EN C, une table (ou chaine de caractere) commence toujours à l'indice 0
donc on compte de 0 à 6

strstr( chaine 1, chaine2)
retourne un pointeur !, pas la valeur 6

ce pointeur pointe sur la 7 case ( indice 6 ) de la chaine inspectée
c'est plus facile d'utiliser un pointeur generique ..

:sifflotte: il va falloir t'y mettre ..
ex;

Code : Tout sélectionner


char 
*p1;
char Chaine1[]="FANTASPIC"
char Chaine2[]="PIC"
....
p1=strstr(Chaine1,Chaine2);
 UART1_Write_Text(Chaine1);CRLF1();
 UART1_Write_Text(Chaine2); CRLF1();
  UART1_Write(*(p1)); CRLF1();
   UART1_Write(*(p1+1)); CRLF1();
    UART1_Write(*(p1+2)); CRLF1();
    UART1_Write(*(p1-1)); CRLF1();
    UART1_Write(*(p1-2)); CRLF1();
  while(1);


Resultat:
FANTASPIC
PIC
P
I
C
S
A
Aide toi, le ciel ou FantasPic t'aidera

Fonction qui trouve une chaine de caractere dans une autre ?
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#10 Message par Jérémy » mer. 24 janv. 2018 16:35

Hello everybody,
paulfjujo a écrit :Source du message :sifflotte: il va falloir t'y mettre ..


C'est pas faux
C'est en faisant des erreurs, que l'on apprend le mieux !!!


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 49 invités