Aide Sscanf

Résolu/Fermé
MaisClement Messages postés 5 Date d'inscription mardi 14 mai 2019 Statut Membre Dernière intervention 29 janvier 2020 - 14 mai 2019 à 16:03
MaisClement Messages postés 5 Date d'inscription mardi 14 mai 2019 Statut Membre Dernière intervention 29 janvier 2020 - 15 mai 2019 à 13:18
Bonjour,

Depuis maintenant quelques jours, je suis bloqué sur la fonction Sscanf :


char s[] = "Dreux (Dreux)/20190513T181000/20190513T181000/";
String dest0;
int h0, m0, s0, hb0, mb0, sb0;
String n1, n2;
sscanf(s, "%s(%sT%2d%2d%2d%sT%2d%2d%2d/", dest0, n1, h0, m0, s0, n2, hb0, mb0, sb0);


J'aimerais récupérer le nom de la ville ainssi que les heures : 18:10,

Si des personnes peuvent m'aidez,

1 réponse

Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
Modifié le 15 mai 2019 à 02:19
Bonjour
%s ça lit une séquence de caractère jusqu'au prochain espace ou équivalent. donc ici "%s(%s" va lire dans dest0 : "Dreux" et dans n1 : "Dreux)/20190513T181000/20190513T181000/"
et donc les formats suivants n'auront plus rien à lire.

Et c'est quoi ce type String?
Et ici il y a 2 noms de ville il faut récupérer lequel?

On pourrait écrire :
sscanf(s, "%[^(]%*[^)]%*[^T]T%2d%2d%*[^T]T%2d%2d" , dest0 , h0 , m0, hb0, mb0);
// "%[^(]" va lire une chaîne tant qu'il n'y a pas '('
// "%*[^)]" va lire tant que pas ')' sans rien stocker
// "%*[^T]" va lire tant que pas 'T' sans rien stocker
// "T" s'attend à lire un T
// "%2d" lit un entier sur exactement 2 chiffres
Attention le nom de ville récupéré ici aura peut-être des espaces en trop au début et la fin, il faudrait les ôter.
1
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié le 15 mai 2019 à 10:03
Super ! On pourrait aussi vérifier la présence des slashs, que les 8 caractères précédant le T sont bien des chiffres et qu'après les minutes il y a bien des secondes (au moins pour le premier timestamp, ou capturer aussi le dernier slash pour se donner les moyens de faire une vérification jusqu'au bout), et vérifier que l'on obtient bien le nombre attendu de variables (la valeur de retour de
sscanf
).

Même si le reste de la description de chaîne n'est pas capturé, si le but n'est pas seulement de capturer les informations dont on a besoin, mais aussi de valider que le format de ce que l'on traite semble cohérent, on pourra alors décider quoi faire si les vérifications de cohérence ne passent pas (avertir l'utilisateur et tenter une capture dégradée, arrêter le programme, la source de données étant jugée suspecte,...).

Aussi, si
h0 , m0, hb0, mb0
sont des
int
, comme dans les lignes postées par MaisClement, il faudra inclure en paramètre de
sscanf
l'adresse de ces variables
&h0 , &m0, &hb0, &mb0
pour que
sscanf
stocke le contenu dans l'espace mémoire alloué à la variable.
0
MaisClement Messages postés 5 Date d'inscription mardi 14 mai 2019 Statut Membre Dernière intervention 29 janvier 2020
15 mai 2019 à 13:18
Merci beaucoup pour votre aide,
Dalfab, je n'avais effectivement pas compris le fonctionnement de %s
0