Menu

Aide Sscanf [Résolu]

Messages postés
2
Date d'inscription
mardi 14 mai 2019
Statut
Membre
Dernière intervention
15 mai 2019
- - Dernière réponse : MaisClement
Messages postés
2
Date d'inscription
mardi 14 mai 2019
Statut
Membre
Dernière intervention
15 mai 2019
- 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,
Afficher la suite 

Votre réponse

1 réponse

Messages postés
401
Date d'inscription
dimanche 7 février 2016
Statut
Membre
Dernière intervention
15 mai 2019
64
0
Merci
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.
[Dal]
Messages postés
5095
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
15 mai 2019
937 -
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.
MaisClement
Messages postés
2
Date d'inscription
mardi 14 mai 2019
Statut
Membre
Dernière intervention
15 mai 2019
-
Merci beaucoup pour votre aide,
Dalfab, je n'avais effectivement pas compris le fonctionnement de %s
Commenter la réponse de Dalfab