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

Traiter un tableau et tri
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 » mer. 25 janv. 2023 11:54

Bonjour à tous,

Dans une application j'ai créer plusieurs tableaux contenant des informations "texte".
Par exemple une adresse mail et un nom.
Je reçois toutes ces informations d'un seul tenant que je place dans un buffer.
Les infos sont séparés par des "~" .

Comment je peux affecter chaque infos au bon tableau ?

exemple je reçois dans mon buffer:
"mail@mail.fr~jeremy"

je souhaiterais enregistré
mail@mail.fr dans le tableau MAIL[]
et jeremy dans le tableau NOM[]

je n'arrive pas avec strchr, avez vous déjà effectué des opérations sur les chaines de caractère dans ce genre ?

Je précise que je connais l'ordre dont les infos arriveront.

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

Traiter un tableau et tri
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#2 Message par Jérémy » mer. 25 janv. 2023 13:13

En fait j'ai vu compliqué alors que je peux faire simple sans utilisé de fonction "string"

Code : Tout sélectionner

   while ( Buffer[i] != '~')
   {
     
MAIL[i] = Buffer[i];
     
i++;
   }
   
i++;
   while ( 
Buffer[i] != '~')
   {
     
NOM[i] = Buffer[i];
     
i++;
   } 
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Traiter un tableau et tri
francois77
Passioné
Passioné
Messages : 307
Enregistré en : avril 2022

#3 Message par francois77 » mer. 25 janv. 2023 13:34

Bonjour Jérémy,

Avec l'estomac plein le cerveau fonctionne mieux exit

A+
Francois

Traiter un tableau et tri
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#4 Message par satinas » mer. 25 janv. 2023 14:04

Bonjour,
L'instruction strtok() retourne un par un les éléments d'une chaîne en spécifiant les caractères de séparation. La chaîne traitée est modifiée, les caractères séparateurs étant remplacés par un 0 de fin de chaîne.

Code : Tout sélectionner

char *s = strtok(buffer, "~");
if (s) {
  strcpy(MAIL, s);
  s = strtok(NULL, "~");
  if (s) strcpy(NOM, s);
}

Traiter un tableau et tri
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#5 Message par Jérémy » mer. 25 janv. 2023 17:25

OUtch !!!!

Dur dur ...
je vais mettre du temps a digérer cela ! pourquoi strcopy ?
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Traiter un tableau et tri
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#6 Message par satinas » mer. 25 janv. 2023 19:49

La fonction strtok() recherche dans le tableau/chaîne buffer le prochain item terminé par '~'. Elle retourne son adresse s et remplace le '~' final par 0. Elle stocke aussi en interne l'adresse p du prochain item, de façon a être lancée plusieurs fois.

Code : Tout sélectionner

chaîne buffer             mail@mail.fr~jeremy~toto@toto.com~toto0

s = strtok(buffer, "~");  mail@mail.fr0jeremy~toto@toto.com~toto0
                          s............p

s = strtok(NULL, "~");    mail@mail.fr0jeremy0toto@toto.com0toto0
                                       s......p

s = strtok(NULL, "~");    mail@mail.fr0jeremy0toto@toto.com0toto0
                                                   s........p

s = strtok(NULL, "~");    mail@mail.fr0jeremy0toto@toto.com0toto0
                                                            s...p
s = strtok(NULL, "~");    retourne s = 0 (NULL)

Traiter un tableau et tri
Jérémy
Administrateur du site
Administrateur du site
Messages : 2722
Âge : 44
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#7 Message par Jérémy » mer. 25 janv. 2023 20:13

Trés belle explication....

cependant quelques détails me perturbe .
le pointeur pointe sur l'adresse du premier token rencontré. Mais comment fait-on pour enregistrer tout le mot sans une boucle ? Pour avancer le pointeur en gros ?

Du coup pourquoi tester s :

Code : Tout sélectionner


if 
(s) {
...
...
}


Ce code fonctionne du coup !

Code : Tout sélectionner


char Buf1
[];
char Buf2[];
char Buf3[];
char Buf4[];
Char Buffer[] = "Data1~Data2~Data3~Data4";

       strcpy(Buf1, strtok(Buffer, "~"));
       strcpy(Buf2, strtok(0, "~"));
       strcpy(Buf3, strtok(0, "~"));
       strcpy(Buf4, strtok(0, "~"));
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Traiter un tableau et tri
satinas
Expert
Expert
Messages : 1225
Enregistré en : novembre 2015

#8 Message par satinas » mer. 25 janv. 2023 20:26

Le principe d'utilisation de la fonction c'est effectivement une boucle. Les pointeurs "item retourné" et "prochain item" sont gérés par la fonction, on se contente de la lancer plusieurs fois, en ne spécifiant le buffer qu'une seule fois au début.

Code : Tout sélectionner

char *s = strtok(buffer, "~"); int i=0;
while (s) {
   strcpy(BUF[i++], s);
   s = strtok(NULL, "~");
}

int n=0;
char *s = strtok(buffer, "~");
while (s) {
   n++;
   if (n%2) strcpy(MAIL, s);
   else strcpy(NOM, s);
   s = strtok(NULL, "~");
}


On fait des if (s) { et des while (s) car il faut vérifier que s est non nul avant de lui appliquer des fonctions chaîne. La fonction retourne 0 (NULL) quand il n'y a plus d'item, et si tu fais strcpy(BUF, NULL), tu vas avoir des problèmes :)


Retourner vers « Langage C »

Qui est en ligne

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