COHERENT manpages

This page displays the COHERENT manpage for printf() [Print formatted text].

List of available manpages
Index


printf() -- STDIO Function (libc)

Print formatted text
#include <stdio.h>
int printf(format [,arg1, .... argN])
char *format; [data type] arg1, ... argN;

printf() prints  formatted text.  It  uses the format string  to specify an
output format for each arg, which it then writes on the standard output.

printf() reads  characters from format  one at a time;  any character other
than a percent sign `%' or  a string that is introduced with a percent sign
is copied directly  to the output.  A `%' tells  printf() that what follows
specifies how the corresponding arg is to be formatted; the characters that
follow `%'  can set the  output width and  the type of  conversion desired.
The following modifiers, in this order, may precede the conversion type:

1. A  minus  sign `-'   left-justifies  the output  field,  instead of  the
   default right justify.

2. A  string of  digits gives  the  width of  the output  field.  Normally,
   printf() pads the field with spaces  to the field width; it is padded on
   the left unless left justification is specified with a `-'.

   If  the field  width  begins with  `0',  the field  is  padded with  `0'
   characters instead of spaces; the `0'  does not cause the field width to
   be taken  as an octal  number.  Note that  this applies only  to numeric
   string descriptors.   If the field  descriptor describes a  character or
   string (i.e., %c or %s), printf()  ignores a leading `0' and always pads
   the field with spaces.

   If the width specification is an asterisk `*', the routine uses the next
   arg as an integer that gives the width of the field.

3. A period  `.' followed by  one or more  digits gives the  precision. For
   floating point (e, f, and  g) conversions, the precision sets the number
   of digits printed after  the decimal point.  For string (s) conversions,
   the precision  sets the  maximum number of  characters that can  be used
   from the string.  If the precision specification is given as an asterisk
   `*',   the routine  uses  the next  arg  as an  integer  that gives  the
   precision.

4. The letter `l'  before any integer conversion (d, o,  x, or u) indicates
   that  the  argument is  a  long  rather than  an  int. Capitalizing  the
   conversion  type has  the same effect;  note, however,  that capitalized
   conversion types  are not compatible  with all C  compiler libraries, or
   with the  ANSI standard.  This  feature will not be  supported in future
   editions of COHERENT.

The following format conversions are recognized:

%  Print a `%' character.  No arguments are processed.

c  Print the int argument as a character.

d  Print the int argument as signed decimal numerals.

e  Print the  float or double argument in exponential  form.  The format is
   d.ddddddesdd, where  there is always one digit  before the decimal point
   and  as many  as  the precision  digits  after it  (default, six).   The
   exponent sign s may be either `+' or `-'.

f  Print the float or double argument  as a string with an optional leading
   minus sign `-',  at least one  decimal digit, a decimal point (`.'), and
   optional decimal  digits after the decimal point.   The number of digits
   after the decimal point is the precision (default, six).

g  Print the float or double argument  as whichever of the formats d, e, or
   f loses no significant precision and takes the least space.

ld Print the long argument as signed decimal numerals.

lo Print the long argument in unsigned octal numerals.

lu Print the long argument in unsigned decimal numerals.

lx Print the long argument in unsigned hexadecimal numerals.

o  Print the int argument in unsigned octal numerals.

p  The  ANSI standard  states that  the  behavior of  the %p  descriptor is
   implementation-specific.  Under COHERENT,  %p prints in format %#.8X the
   literal value of a pointer.   Its corresponding variable must be of type
   char *.

r  The next argument  points to an array of new  arguments that may be used
   recursively.  The first argument of the list is a char * that contains a
   new format  string.  When the  list is exhausted,  the routine continues
   from where it left off in the original format string.

   This  descriptor  is  not  part  of  the  ANSI  Standard.   Its  use  is
   deprecated.  Code that uses it may not be portable to other systems.

s  Print the  string to which the char *  argument points.  Reaching either
   the end of  the string, indicated by a null  character, or the specified
   precision, will  terminate output.  If  no precision is  given, only the
   end of the string will terminate.

u  Print the int argument in unsigned decimal numerals.

x  Print the int argument in unsigned hexadecimal numerals.  The digits are
   prefaced by the string 0x.

X  Like %x,  except that the  digits are prefaced  by the string  0X.  Note
   COHERENT release 4.2 has changed the  means of %X to conform to the ANSI
   C standard.   In versions prior  to release 4.2,  this format conversion
   printed a long argument in unsigned hexadecimal numerals.  Programs that
   depend upon the obsolete use of  %X will no long work the same under the
   current release of COHERENT.

If it wrote the formatted  string correctly, printf() returns the number of
characters written.  Otherwise, it returns a negative number.

Example

This example implements  a mini-interpreter for printf() statements.  It is
a convenient tool for seeing exactly how some of the printf() options work.
To use  it, type  a printf() conversion  specification at the  prompt.  The
formatted string  will then appear.   To reuse a  format identifier, simply
type <return>:

#include <math.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* the replies go here */
static char reply[80];

/* ask for a string and echo it in reply. */
char *askstr(msg)
char *msg;
{
    printf("Enter %s ", msg);
    fflush(stdout);

    if (gets(reply) == NULL)
        exit(EXIT_SUCCESS);
    return (reply);
}

main()
{
    char fid[80], c;

    /* initialize to an invalid format identifier */
    strcpy(fid, "%Z");

    for (;;) {
        askstr("format identifier");
        /* null reply uses previous FID */
        if (reply[0])
            /* leave the '%' */
            strcpy(fid + 1, reply);

        switch(c = fid[strlen(fid) - 1]) {
        case 'd':
        case 'i':
            askstr("signed number");
            if(strchr(fid, 'l') != NULL)
                printf(fid, atol(reply));
            else
                printf(fid, atoi(reply));
            break;

        case 'o':
        case 'u':
        case 'x':
        case 'X':
            askstr("unsigned number");
            if(strchr(fid, 'l') != NULL)
                printf(fid, atol(reply));
            else
                printf(fid, (unsigned)atol(reply));
            break;

        case 'f':
        case 'e':
        case 'E':
        case 'g':
        case 'G':
            printf(fid, atof(askstr("real number")));
            break;

        case 's':
            printf(fid, askstr("string"));
            break;

        case 'c':
            printf(fid, *askstr("single character"));
            break;

        case '%':
            printf(fid);
            break;

        case 'p':
            /* print pointer to format id */
            printf(fid, fid);
            break;

        case 'n':
            printf("n not implemented");
            break;

        default:
            printf("%c not valid", c);
        }

        printf("\n");
    }
}

See Also

ecvt(),
fcvt(),
fprintf(),
gcvt(),
libc,
putc(),
puts(),
scanf(),
sprintf(),
vprintf()
ANSI Standard, §7.9.6.3
POSIX Standard, §8.1

Notes

Because  C  does not  perform  type  checking, it  is  essential that  each
argument match its counterpart in the format string.

Versions of COHERENT prior to release 4.2 recognized the conversion formats
%D,  %O, and  %U. The  ANSI  standard does  not recognize  these conversion
characters, and  beginning with release 4.2  the COHERENT implementation of
printf() no longer  recognizes them.  You should instead use, respectively,
the conversion characters %ld, %lo, and %lu.