OVH Cloud OVH Cloud

sscanf

3 réponses
Avatar
michel
Bonjour,

J'ai une petite question qui m'agace; j'ai fait autrement, mais ça
m'énerve de ne pas avoir la réponse.

A propos de sscanf, je lis dans la doc Nexen (les explications de sscanf
sont à chercher dans sprintf), que l'on peut définir un autre
séparateur que l'espace, pour exemple, ils mettent ceci :

printf("[%'#10s]\n", $s);

pour une variable quelconque $s.

Ce qui correspond à l'explication littérale qu'il donne pour le
caractère d'espacement, puisqu'ils disent qu'il doit être préfixé d'un "'".

Or, si j'essaye avec sscanf, j'ai droit à une belle erreur de php qui ne
comprend pas l'argument.

Comment faites-vous pour préciser un caractère d'espacement différent
avec sscanf (si c'est possible)?

J'ai cherché partout, rien trouvé.

Merci.

Michel

3 réponses

Avatar
Olivier Miakinen

A propos de sscanf, je lis dans la doc Nexen (les explications de sscanf
sont à chercher dans sprintf), que l'on peut définir un autre
séparateur que l'espace, pour exemple, ils mettent ceci :

printf("[%'#10s]n", $s);

pour une variable quelconque $s.


Oui. Attention, dans la doc en français (en tout cas celle que l'on
trouve sur www.php.net) il y a une erreur. Ils ont oublié le « sign
specifier » (spécificateur de signe) et le « padding specifier » a été
indiqué deux fois, une fois sous le nom de spécificateur d'espacement
et une fois sous le nom de remplisseur.

Ce qui correspond à l'explication littérale qu'il donne pour le
caractère d'espacement, puisqu'ils disent qu'il doit être préfixé d'un "'".


En fait, la bonne traduction est plutôt « remplisseur ». Il s'agit de
savoir par quoi on remplit un champ lorsque la valeur est plus petite
que l'espace dont on dispose. Souvent c'est par des espaces, quelquefois
par des 0 pour les nombres, et sinon on peut mettre ce qu'on veut grâce
à cette syntaxe.

Curieusement, cela semble être particulier au sprintf de PHP, inconnu
des syntaxes de sprintf() en C :
<http://www.google.fr/search?q=man+sprintf+%22padding+specifier%22>

Or, si j'essaye avec sscanf, j'ai droit à une belle erreur de php qui ne
comprend pas l'argument.


Très certainement parce que l'argument n'existe que pour sprintf.
D'ailleurs le traitement des caractères blancs dans sscanf se fait
en dehors des séquences %-quelque-chose, je ne vois pas bien comment
une spécification de conversion pourrait influer sur le traitement
des séparateurs avant et après.


Comment faites-vous pour préciser un caractère d'espacement différent
avec sscanf (si c'est possible)?

J'ai cherché partout, rien trouvé.


Tu sais combien il y a de tels caractères à chaque fois ? Si oui, c'est
facile : tu les mets tels quels dans la chaîne. Sinon, utilise plutôt
preg_match(), preg_replace(), strtok(), split(), preg_split(), explode()
et ainsi de suite.

Un exemple du premier cas : pour extraire les nombres dans "##32#10###9"
tu peux utiliser "##%d#%d###%d".

Avatar
michel
Le Sat, 18 Nov 2006 22:02:51 +0000, Olivier Miakinen a écrit :

...
Oui. Attention, dans la doc en français (en tout cas celle que l'on
trouve sur www.php.net) il y a une erreur. Ils ont oublié le « sign
specifier » (spécificateur de signe) et le « padding specifier » a été
indiqué deux fois, une fois sous le nom de spécificateur d'espacement
et une fois sous le nom de remplisseur.
...
En fait, la bonne traduction est plutôt « remplisseur ». Il s'agit de
savoir par quoi on remplit un champ lorsque la valeur est plus petite
que l'espace dont on dispose. Souvent c'est par des espaces, quelquefois
par des 0 pour les nombres, et sinon on peut mettre ce qu'on veut grâce
à cette syntaxe.
...
Bon, il y a bien une erreur; ça me turlupinait la moelle épinière.


Curieusement, cela semble être particulier au sprintf de PHP, inconnu
des syntaxes de sprintf() en C :
<http://www.google.fr/search?q=man+sprintf+%22padding+specifier%22>
...

Dus peu de connaissances en C qu'il me reste, je confirme.

Très certainement parce que l'argument n'existe que pour sprintf.
D'ailleurs le traitement des caractères blancs dans sscanf se fait
en dehors des séquences %-quelque-chose, je ne vois pas bien comment
une spécification de conversion pourrait influer sur le traitement
des séparateurs avant et après.

Contrairement à ce qui est indiqué dans la doc qui dit que les arguments

sont à trouver à la rubrique sprintf et sont les mêmes que pour
sscanf.
...
Tu sais combien il y a de tels caractères à chaque fois ? Si oui,
c'est facile : tu les mets tels quels dans la chaîne. Sinon, utilise
plutôt preg_match(), preg_replace(), strtok(), split(), preg_split(),
explode() et ainsi de suite.

Un exemple du premier cas : pour extraire les nombres dans "##32#10###9"
tu peux utiliser "##%d#%d###%d".


C'est bon, j'ai fait autrement. Ma chaîne commence dans certains cas par
un "#", et je fais juste un test par une expression régulière sur le
premier caractère, , je l'ôte par substr (euh si je me souviens bien),
et je la traite en fonction de ce cas déterminé.

Merci beaucoup, j'ai mes réponses.

Michel

Avatar
Olivier Miakinen

[...] ce qui est indiqué dans la doc qui dit que les arguments
sont à trouver à la rubrique sprintf et sont les mêmes que pour
sscanf.


Oui, ce sont les mêmes pour les arguments standards (%d, %s, etc.) mais
il y a forcément des différences. Je trouve vraiment dommage qu'ils
aient eu la flemme de faire une doc séparée : par exemple, on ne sait
pas si la syntaxe %*d est acceptée pour sscanf.

C'est bon, j'ai fait autrement. Ma chaîne commence dans certains cas par
un "#", et je fais juste un test par une expression régulière sur le
premier caractère, , je l'ôte par substr (euh si je me souviens bien),
et je la traite en fonction de ce cas déterminé.


Pour un cas aussi simple, ce n'est peut-être pas la peine d'aller
chercher le marteau-pilon des expressions régulières :

if ($str[0] == '#') $str = substr($str, 1);

ou bien :

if (substr($str, 0, 1) == '#') $str = substr($str, 1);