mirror of
https://github.com/lcn2/calc.git
synced 2025-08-16 01:03:29 +03:00
116 lines
4.7 KiB
Plaintext
116 lines
4.7 KiB
Plaintext
NAME
|
|
strscanf - formatted scan of a string
|
|
|
|
SYNOPSIS
|
|
strscanf(str, fmt, x_1, x_2, ...)
|
|
|
|
TYPES
|
|
str string
|
|
fmt string
|
|
x_1, x_2, ... lvalues
|
|
|
|
return null, nonnegative integer, or error value
|
|
|
|
DESCRIPTION
|
|
If the str is "", the null value is returned.
|
|
|
|
Otherwise, until the terminating null character of either fmt or str
|
|
is reached, characters other than '%' and whitespace are read from
|
|
fmt and compared with the corresponding characters read from str.
|
|
If the characters match, reading continues. If they do not match
|
|
an integer value is returned. If whitespace is encountered in fmt,
|
|
starting at the current positions in fmt and str, any whitespace
|
|
characters are skipped and reading and comparison begins as before
|
|
if neither fmt nor str has reached its end.
|
|
|
|
When a '%' is encountered in fmt, if this is immediately followed by
|
|
another '%', the pair formed is considered as if one '%' were read and
|
|
reading from fmt and fs continues if and only if fs has a matching
|
|
'%'. A single '%' read from fmt is taken to indicate the beginning of
|
|
a conversion specification field consisting in succession of:
|
|
|
|
an optional '*',
|
|
optional decimal digits,
|
|
one of 'c', 's', 'n', 'f', 'e', 'i' or a scanset specifier.
|
|
|
|
A scanset specifier starts with '[' and an optional '^', then an optional
|
|
']', then optional other characters, and ends with ']'. If any
|
|
other sequence of characters follows the '%', characters before the
|
|
first exceptional character (which could be the terminating null
|
|
character of the fmt string) are ignored, e.g. the sequence " %*3d " does
|
|
the same as " d ". If there is no '*' at the beginning of the specifier,
|
|
and the list x_1, x_2, ... has not been exhausted,
|
|
a value will be assigned to the next lvalue in the list; if no lvalue
|
|
remains, the reading of fs stops and the function returns the number
|
|
of assignments that have been made.
|
|
|
|
Occurrence of '*' indicates that characters as specified are to be read
|
|
but no assignment will be made.
|
|
|
|
The digits, if any, read in the specifier are taken to be decimal digits
|
|
of an integer which becomes the maximum "width" (number of characters
|
|
to be read from str for string-type assignments); absence of digits or
|
|
all zero digits in the 'c' case are taken to mean width = 1. Zero width
|
|
for the other cases are treated as if infinite. Fewer characters than
|
|
the specifier width may be read if end-of-file is reached or in the case
|
|
of scanset specification, an exceptional character is encountered.
|
|
|
|
If the ending character is 'c', characters are read from fs to
|
|
form a string, which will be ignored or in the non-'*' case, assigned
|
|
to the next lvalue.
|
|
|
|
In the 's' case, reading to form the string starts at the first non-white
|
|
character (if any) and ceases when end-of-file or further white space
|
|
is encountered or the specified width has been attained.
|
|
|
|
The cases 'f', 'e', 'r', 'i' may be considered to indicate expectation of
|
|
floating-point, exponential, ratio, or integer representation of the
|
|
number to be read. For example, 'i'
|
|
might be taken to suggest a number like +2345; 'r' might suggest
|
|
a representation like -27/49; 'e' might suggest a representation like
|
|
1.24e-7; 'f' might suggest a representation like 27.145. However, there
|
|
is no test that the the result conforms to the specifier. Whatever
|
|
the specifier in these cases, the result depends on the characters read
|
|
until a space or other exceptional character is read. The
|
|
characters read may include one or more occurrences of +, -, * as
|
|
well as /, interpreted in the usual way, with left-to-right associativity
|
|
for + and -, and for * and /. Also acceptable is a trailing i to
|
|
indicate an imaginary number. For example the expression
|
|
|
|
2+3/4*7i+3.15e7
|
|
|
|
would be interpreted as for an ordinary evaluation. A decimal fraction
|
|
may have more than one dot: dots after the first, which is taken to be
|
|
the decimal point, are ignored. Thus "12.3..45e6.7" is interpreted
|
|
as if it were "12.345e67".
|
|
|
|
For the number specifiers 'f', 'e', 'r', 'i', any specified width is
|
|
ignored.
|
|
|
|
For the specifier 'n', the index of the next character to b e read
|
|
is assigned to the corresponding lvalue. (Any width or skip specification
|
|
is ignored.)
|
|
|
|
|
|
EXAMPLE
|
|
> global a, b, c, d
|
|
> A = "abc xyz 234.6 alpha"
|
|
> strscanf(A, "%s%*[^0123456789]%f%n", a, b, c)
|
|
3
|
|
> print a, b, c
|
|
> abc 234.6 13
|
|
|
|
> strscanf(A, "%*13c%s", d);
|
|
1
|
|
> print d
|
|
> alpha
|
|
|
|
LIMITS
|
|
none - XXX - is this correct?
|
|
|
|
LIBRARY
|
|
none - XXX - is this correct?
|
|
|
|
SEE ALSO
|
|
fscanf, scanf, fscan, strscan, scan, print, printf
|