Navigation:  Reference > Functions By Category > Strings >

cPrintf()

Previous pageReturn to chapter overviewNext page

Merge template string with one or more parameters.

 

Syntax:

cPrintf(cTemplate, params..... )      -> cFormatedString

cPrintf( NIL , cFmt , ...params... )  -> see bottom 'Enhancements...'

             // Parse some embedded escape sequences in cFmt

 

Parameters:

<cTemplate>

cTemplate will use the same wildcards as sprintf().
This string contains one or more variables with format

specifications -> Format Specifications.

 

<params>

follow the rules of nFpCall() so NIL values have special meaning

internally uses sprintf() from the C stdlib so cTemplate will
use the same wildcards as sprintf()

 

FORMAT SPECIFICATIONS

 

A format specification, which consists of optional and required fields, has the following form:

 

%[flags] [width] [.precision] [{h | l | ll | I | I32 | I64}] type

 

Each field of the format specification is a single character or a number signifying a particular format option.

The simplest format specification contains only the percent sign and a type character (for example, %s).

If a percent sign is followed by a character that has no meaning as a format field, the character is not changed.

For example, to print a percent-sign character, use %%.

 

The optional fields, which appear before the type character, control other aspects of the formatting, as follows:

 

type

Required character that determines whether the associated argument

is interpreted as a character, a string, or a number (see the "printf

Type Field Characters" table in printf Type Field Characters).

 

flags

Optional character or characters that control justification of output

and printing of signs, blanks, decimal points, and octal and hexadecimal

prefixes (see the "Flag Characters" table in Flag Directives).

More than one flag can appear in a format specification.

 

width

Optional number that specifies the minimum number of characters output

(see printf width specification).

 

precision

Optional number that specifies the maximum number of characters printed

for all or part of the output field, or the minimum number of digits printed

for integer values (see the "How Precision Values Affect Type" table in Precision Specification).

 

h| l| ll| I| I32| I64

Optional prefixes to type-that specify the size of argument

(see the "Size Prefixes" table in Size and Distance Specification).

 

 

TYPE FIELD CHARACTERS

 

The type character is the only required format field; it appears after any optional format fields. The type character determines whether the associated argument is interpreted as a character, string, or number. The types C, n, p, and S, and the behavior of c and s with printf functions, are Microsoft extensions and are not ANSI compatible.

 

c

int or wint_t

When used with printf functions, specifies a single-byte character;

when used with wprintf functions, specifies a wide character.

 

C

int or wint_t

When used with printf functions, specifies a wide character;

when used with wprintf functions, specifies a single-byte character.

 

d

int

Signed decimal integer.

 

i

int

Signed decimal integer.

 

o

int

Unsigned octal integer.

 

u

int

Unsigned decimal integer.

 

x

int

Unsigned hexadecimal integer, using "abcdef."

 

X

int

Unsigned hexadecimal integer, using "ABCDEF."

 

e

double

Signed value having the form [-]d.dddd e [sign]dd[d] where d is a single decimal digit, dddd is one or more decimal digits, dd[d] is two or three decimal digits depending on the output format and size of the exponent, and sign is + or -.

 

E

double

Identical to the e format except that E rather than e introduces the exponent.

 

f

double

Signed value having the form [-]dddd.dddd, where dddd is one or more decimal digits. The number of digits before the decimal point depends on the magnitude of the number, and the number of digits after the decimal point depends on the requested precision.

 

g

double

Signed value printed in f or e format, whichever is more compact for the given value and precision. The e format is used only when the exponent of the value is less than -4 or greater than or equal to the precision argument. Trailing zeros are truncated, and the decimal point appears only if one or more digits follow it.

 

G

double

Identical to the g format, except that E, rather than e, introduces the exponent (where appropriate).

 

a

double

Signed hexadecimal double precision floating point value having the form

[-]0xh.hhhh p±dd, where h.hhhh are the hex digits (using lower case letters)

of the mantissa, and dd are one or more digits for the exponent.

The precision specifies the number of digits after the point.

 

A

double

Signed hexadecimal double precision floating point value having the form [-]0Xh.hhhh P±dd, where h.hhhh are the hex digits (using capital letters) of the mantissa, and dd are one or more digits for the exponent. The precision specifies the number of digits after the point.

 

n

Pointer to integer

Number of characters successfully written so far to the stream or buffer; this value is stored in the integer whose address is given as the argument. See Security Note below.

 

p

Pointer to void

Prints the argument as an address in hexadecimal digits.

 

s

String

When used with printf functions, specifies a single-byte-character string; when used with wprintf functions, specifies a wide-character string. Characters are printed up to the first null character or until the precision value is reached.

 

S

String

When used with printf functions, specifies a wide-character string; when used with wprintf functions, specifies a single-byte-character string. Characters are printed up to the first null character or until the precision value is reached.

 

  ? cPrintf( "Computer Name : [%s]", cGetComputerName() )

    -> Computer Name : [MyPC]

 

  ? cPrintf( "My %s is in %s ","home","Germany")

    -> My home is in Germany

 

 

Enhancement:

 

starting with   001.005.002.204   cPrintf() function now has no character limit.

Previous versions had a limit of 1024 chars.

 

starting with   001.005.003.126   cPrintf() function now can parse some embedded escape sequences:

if first parameter is NIL ...

cPrintf( NIL , cFmt , ...params... ) // Parse some embedded escape sequences in cFmt

       \xnn  // Hex character  

       \dnnn // dec character    // ot4xb extension

       \q    //  Double Quote    // ot4xb extension

       \a    //  Bell

       \b    //  Backspace

       \f    //  Formfeed

       \n    //  New line

       \r    //  Carriage return

       \t    //  Horizontal tab

       \v    //  Vertical tab

       \\    //  Backslash

 

Some compilers like C provide a literal escape string parsing during the compilation step.

So something like

cVar = "First Line\r\nSecond Line"  

is automatically translated to

cVar = "First Line" + Chr(13) + (Chr(10) +"Second Line"

 

Because this is a compiler task common runtime functions like printf() assume this

transformations are resolved previously by the compiler.

 

The original ot4xb cPrintf(cFmt,...params... ) syntax does nothing with this escape sequences

just a wrapper for the _sprintf() function of the C runtime

 

I was decide don't change this behavior because cFmt can come from any source

( literal in the prg , string resource, database, filenames with path, .... ) so any changes in this behavior

will break the existing code.

 

So I added an alternate syntax   cPrintf( , cFmt , ....params.... )   shifting all the arguments 1 position

to got the extended behavior that parse escape sequences embedded in the cFmt string

 

Example:

 

? cPrintf( "This is the amp character \x26" ) 

           -> "This is the amp character \x26"

? cPrintf( NIL,"This is the amp character \x26" )  

                            ->    "This is the amp character &"

 

The first syntax will output the string "\x26" untransformed while the second syntax will replace \x26 to &