Table des matières
scan
Analyse une chaîne en utilisant des spécificateurs de conversion dans le style de sscanf
Syntaxe
scan string format ?varName varName ...?
Description
Cette commande analyse les champs à partir d'une chaîne d'entrée de la même façon que la fonction ANSI C sscanf et retourne un compte du nombre de conversions effectuées, ou -1 si la fin de la chaîne d'entrée est atteinte avant qu'une conversion ait été effectuée String donne l'entrée a analyser et format indique comment l'analyser, en utilisant les spécificateurs de conversions % comme dans sscanf. Chaque varName donne le nom d'une variable; quand un champ est scanné à partir de string le résultat est converti en une chaîne et assigné à la variable correspondante. Si aucunes variables varName ne sont spécifiées, alors scan fonctionne d'une manière linéaire, retournant les données qui seraient autrement stockées dans les variables comme une liste. Dans le cas linéaire, une chaîne vide est renvoyée quand la fin de la chaîne d'entrée est atteinte avant qu'une conversion ait été effectuée
Détails sur le scanning
Scan opère en scannant string et format ensemble. Si le caractère suivant dans format est un espace ou une tabulation alors il correspond à un nombre quelconque d'espaces dans string (incluant zéro). Autrement, si ce n'est pas un caractère % alors il doit correspondre au caractère suivant de string. Quand un % est rencontrée dans format, il indique le début d'un spécificateur de conversion. Un spécificateur de conversion contient jusqu’à quatre champs après le %: une [24], indique que la valeur convertie est écartée au lieu d'être assignée à une variable; un spécificateur de position XPG3; un nombre indiquant une largeur de champ maximum; et un caractère de conversion. Tous ces champs sont optionnels excepté le caractère de conversion. Les champs présents doivent apparaître dans l'ordre indiqué plus haut.
Quand scan trouve un spécificateur de conversion dans format, il saute en premier tout espace dans string (à moins que le spécificateur soit [ ou c). Ensuite il convertit les caractères d'entrée suivants en accord avec le spécificateur de conversion et range le résultat dans la variable désignée par l'argument suivant à scan.
Si le % est suivi par un nombre décimal et un $, comme dans “%2$d”, alors la variable à utiliser n'est pas extraite de l'argument suivant. Contrairement, elle est extraite de l'argument indiqué par le nombre, where 1 corresponds à la première varName. Si il y a un quelconque spécificateur de position dans format alors tous les spécificateurs doivent être positionnels. Toutes les varName sur la liste d'arguments doivent correspondre exactement à un spécificateur de conversion ou une erreur est générée, ou dans le cas linéaire, toute position peut être spécifiée au moins une fois et les positions vides seront remplies avec des chaînes vides.
Les caractères de conversions suivants sont supportés:
- d Le champ d'entrée doit être un entier décimal. Il est lu et la valeur est stockée dans la variable comme chaîne décimale.
- o Le champ d'entrée doit être un entier octal. Il est lu et la valeur est stockée dans la variable comme chaîne décimale.
- x Le champ d'entrée doit être un entier hexadécimal. Il est lu et la valeur est stockée dans la variable comme chaîne décimale.
- u Le champ d'entrée doit être un entier décimal. La valeur est stockée dans la variable comme chaîne entière décimale non signée.
- i Le champ d'entrée doit être un entier La base (ex. décimale, octal, ou hexadécimal) est déterminée de la même façon que décrite dans expr. La valeur est stockée dans la variable comme chaîne décimale.
- c Un seul caractère est lu et sa valeur binaire est stockée dans la variable comme chaîne décimale. L'espace initial n'est pas sauté dans ce cas, donc le champ d'entrée peut être un espace. Cette conversion est différente du standard ANSI dans lequel le champ d'entrée consiste toujours en un simple caractère et ou aucune largeur de champ ne peut être spécifiée.
- s Le champ d'entrée consiste en tous les caractères jusqu’à l'espace suivant; les caractères sont copiés dans la variable.
- e ou f ou g Le champ d'entrée doit être un nombre à virgule flottante consistant d'un signe optionnel, une chaîne de chiffres décimaux pouvant contenir un point décimal, et un exposant optionnel consistant d'un e ou E suivi par un signe optionnel et une chaîne de chiffres décimaux. Il est lu et stocké dans la variable comme une chaîne flottante.
- [chars] Le champ d'entrée consiste en un nombre quelconque de caractères dans chars. La chaîne correspondante est stockée dans la variable. Si le premier caractère entre crochets est un ] alors il est traité comme faisant partie de chars plutôt que le crochet fermant l'ensemble. Si chars contient une séquence de la forme a-z alors tout caractère entre a et z (inclus) correspondra. Si le premier ou dernier caractère entre crochets est un -, alors il est traité comme faisant partie de chars plutôt que d'indiquer un intervalle.
- [^chars] Le champ d'entrée consiste en un nombre quelconque de caractères non inclus dans chars. La chaîne correspondante est stockée dans la variable. Si le caractère suivant immédiatement le ^ est un ] alors il est traité comme partie de l'ensemble plutôt que le crochet fermant l'ensemble. Si chars contient une séquence de la forme a-z alors tout caractère entre a et z (inclus) sera exclu de l'ensemble. Si le premier ou le dernier caractère entre crochets est un -, alors il est traité comme faisant partie de chars plutôt que d'indiquer un intervalle.
- n Aucune entrée n'est utilisée de la chaîne d'entrée. Par contre, le nombre total de caractères scannés de la chaîne d'entrée est stocké dans la variable.
Le nombre de caractères lus de l'entrée pour conversion est le plus grand nombre qui a un sens pour cette conversion (ex. le plus grand nombre de chiffres décimaux possibles pour %d, le plus grand nombre de chiffres octaux possibles pour %o, et ainsi de suite). Le champ d'entrée pour une conversion donnée se termine soit quand un espace est rencontré ou quand la largeur maximum de champ a été atteinte, suivant lequel est rencontré en premier. Si une * est présente dans le spécificateur de conversion alors aucune variable n'est assignée et l'argument suivant n'est pas utilisé
Différences avec SSCANF
Le comportement de la commande scan est le même que celui de la fonction ANSI C sscanf excepté les différences suivantes:
- Le spécificateur de conversion %p n'est pas supporté.
- Pour les conversions %c une seule valeur caractère est convertie en chaîne décimale, qui est alors assignée à la correspondante varName; aucune largeur de champ ne peut être spécifiée pour cette conversion.
- Les modificateurs l, h, et L sont ignorés; les valeurs entières sont toujours converties comme s'il n'y avait pas de modificateur présent et les valeurs réelles sont toujours converties comme si le modificateur l était présent (ex. le type double est utilisé pour la représentation interne).
- Si la fin de la chaîne d'entrée est atteinte avant que quelconque conversion ait été effectuée et qu'aucune variable n'ait été donnée, une chaîne vide est renvoyée