vscanf and vprintf

Discussion in 'C Programming' started by Kavya, Nov 18, 2006.

  1. Kavya

    Kavya Guest

    What is the basic purpose of vscanf and vprintf? Can someone explain
    with small example?
    Kavya, Nov 18, 2006
    #1
    1. Advertising

  2. Kavya

    santosh Guest

    Kavya wrote:
    > What is the basic purpose of vscanf and vprintf? Can someone explain
    > with small example?


    See below, (read the copyright notice too):

    <http://www.dinkumware.com/manuals/?manual=compleat&page=stdio.html#vprintf>
    santosh, Nov 18, 2006
    #2
    1. Advertising

  3. Kavya

    santosh Guest

    Kavya wrote:
    > What is the basic purpose of vscanf and vprintf? Can someone explain
    > with small example?


    Also see:

    <http://c-faq.com/varargs/vprintf.html>
    <http://c-faq.com/varargs/vscanf.html>
    santosh, Nov 18, 2006
    #3
  4. Kavya

    Bill Reid Guest

    Kavya <> wrote in message
    news:...

    > What is the basic purpose of vscanf and vprintf? Can someone explain
    > with small example?
    >

    They take a pointer to a list of arguments rather than the arguments
    themselves. The purpose, if you need it, is to allow you to create an
    argument list based on some interactive need, then pass it to the
    "v"-printf and -scanf functions.

    I actually posted an OFF-TOPIC example recently, using
    vsprintf(), that illustrates one "real-world" use:

    From: Bill Reid <>
    Newsgroups: comp.lang.c
    Subject: Re: Output to a control instead of the MS Dos box for C programs
    Date: Tuesday, November 07, 2006 1:58 PM

    tizi_de <> wrote in message
    news:...

    > Hello all,
    >
    > I'm looking for a sample program in C to print out lines not to the
    > standard MS Dos Box but into a different control e.g. text control.
    >
    > Has C the possibility to do printouts to a control instead of using the
    > MS Dos Box? And what control can I use for this purpose when I need to
    > have the most similar look to the MS Dos Box?
    >

    OFF TOPIC!!!

    > Every help is greatly appreciated.
    > Thanks in advance.
    >

    But since you asked so nicely...

    ....

    So if I compile the thing as a Windows GUI application,
    the pre-processor turns all occurences of printf() into
    gui_printf(), which is declared in "p_output.h" and defined
    in a file called "p_output.c" which is linked into your
    program.

    gui_printf() is declared with the exact same "signature"
    as "printf()", and defined as follows:

    int gui_printf(char *format,...) {
    unsigned print_length;

    p_line_buffer[0]=NUL;
    va_list ap;

    va_start(ap,format);
    vsprintf(p_line_buffer,format,ap);
    va_end(ap);

    print_length=(int)strlen(p_line_buffer);

    print_line_buffer();

    return print_length;
    }

    Note that the trick here is the use of the "vsprintf()"
    function to handle all the functionality of "printf()" without
    the nasty consequence of actually sending the output to
    the "console". Instead, the formatted output is "printed"
    to a buffer, and then the buffer is "printed" to the
    Windows control by the "print_line_buffer()" function.

    ....

    ---end of archived excerpt

    Despite any debate about the topicality or advisability of doing
    the above, note that you have to follow all the rules of creating
    a "variadic" argument list, using va_start() and va_end(), to use
    the "v" functions:

    va_start(ap,format);
    vsprintf(p_line_buffer,format,ap);
    va_end(ap);

    So what you do is build up a "format" string interactively as
    needed (such as "Here's some stuff: %s %d %d %d", whatever),
    then when you want to printf() or scanf(), call va_start() to "start"
    the formatting of the variadic list, call your "v" function with
    your "format" string, then call va_end().

    ---
    William Ernest Reid
    Bill Reid, Nov 18, 2006
    #4
  5. Kavya

    Eric Sosman Guest

    Bill Reid wrote:
    > Kavya <> wrote in message
    > news:...
    >
    >
    >>What is the basic purpose of vscanf and vprintf? Can someone explain
    >>with small example?
    >>

    >
    > They take a pointer to a list of arguments rather than the arguments
    > themselves. The purpose, if you need it, is to allow you to create an
    > argument list based on some interactive need, then pass it to the
    > "v"-printf and -scanf functions.


    The first sentence isn't quite right, and the second is
    simply wrong.

    The vxxxxx() functions differ from their plain xxxxx()
    brethren in one way: Instead of taking a variable number of
    arguments they take a fixed number of arguments, one of which
    is a va_list. This va_list object allows the vxxxxx() function
    to access its caller's variable arguments. However, it's not
    illuminating to refer to a va_list as "a pointer to a list of
    arguments;" a va_list is some kind of compiler magic that may
    not involve pointers at all.

    C has no way to "create an argument list" other than by
    writing a function call in the source code. The call itself
    is not in any sense "variable:" if you provide a string and
    three int's when you write the call, that call will always
    produce an argument list consisting of a string and three
    int's. Nothing less, nothing more, and nothing else. Some
    systems provide extra magic to allow fancier things, but these
    incantations are "C with extras," not C.

    So, what use are the vxxxxx() functions? They're handy when
    you want to write a function that behaves very much like one
    of the ordinary xxxxx() functions, but does something a little
    bit special. For example, you might want a function that is
    "just like" printf() but sends its output to a logging stream
    as well as to stdout. The signature should be

    int doubleprint(const char *format, ...);

    like printf(), but how will you actually write the function?
    Do you need to write what amounts to a complete printf() format
    interpreter just to implement your special logger?

    vprintf() and vfprintf() to the rescue. You write something
    like

    int doubleprint(const char *format, ...) {
    int result;
    va_list ap;

    /* print to stdout: */
    va_start(ap, format);
    vprintf(format, ap);
    va_end(ap);

    /* ... and now to the log: */
    va_start(ap, format);
    result = vfprintf(logstream, format, ap);
    va_end(ap);

    return result;
    }

    (I say "something like" because it's not entirely clear what
    value to return if you get an I/O error writing to one stream
    while output to the other succeeds -- but that's a separate
    issue.) There is no way doubleprint() can pass its own "..."
    arguments to printf() or fprintf(), but it *can* latch onto
    them with a va_list and pass *that* instead.

    Other likely uses: Adding time stamps or similar decorations
    to output lines, "printing" to a buffer that will then be handed
    to some service C's I/O doesn't support well (GUI dialog boxes,
    perhaps), and anything else where you want a capability that is
    similar to but a little different from that provided by a
    variable-argument function in the Standard C library.

    > I actually posted an OFF-TOPIC example recently, using
    > vsprintf(), that illustrates one "real-world" use:
    > [...]


    This is a perfectly typical example of using a "printf-like"
    function to create output for a non-printf-able destination (and
    it seems adequately topical to me; no need to apologize for using
    a vxxxxx() function as it is intended).

    --
    Eric Sosman
    lid
    Eric Sosman, Nov 18, 2006
    #5
  6. Kavya

    Bill Reid Guest

    Eric Sosman <> wrote in message
    news:...
    > Bill Reid wrote:
    > > Kavya <> wrote in message
    > > news:...
    > >
    > >>What is the basic purpose of vscanf and vprintf? Can someone explain
    > >>with small example?
    > >>

    > > They take a pointer to a list of arguments rather than the arguments
    > > themselves. The purpose, if you need it, is to allow you to create an
    > > argument list based on some interactive need, then pass it to the
    > > "v"-printf and -scanf functions.

    >
    > The first sentence isn't quite right, and the second is
    > simply wrong.
    >

    Yeah, and worse, pretty misleading...who wrote that, anyway?

    > The vxxxxx() functions differ from their plain xxxxx()
    > brethren in one way: Instead of taking a variable number of
    > arguments they take a fixed number of arguments, one of which
    > is a va_list.


    In one sense, they move the "variadic" list processing out of the
    printf or scanf functions into the calling function where it can be
    used for several purposes as you note below...

    > This va_list object allows the vxxxxx() function
    > to access its caller's variable arguments. However, it's not
    > illuminating to refer to a va_list as "a pointer to a list of
    > arguments;" a va_list is some kind of compiler magic that may
    > not involve pointers at all.
    >

    Whoops, FAQ update needed?

    comp.lang.c FAQ list ยท Question 15.5
    Q: How can I write a function that takes a format string and a variable
    number of arguments, like printf, and passes them to printf to do most
    of the work?

    A: Use vprintf, vfprintf, or vsprintf. These routines are like their
    counterparts printf, fprintf, and sprintf, except that instead of a
    variable-length argument list, they accept a single va_list pointer.

    ---end of FAQ excerpt

    And update just about every "popular" piece of documentation on the
    topic...for example, from my development package non-documentation:

    The v...printf functions are known as alternate entry points
    for the ...printf functions. They behave exactly like their ...printf
    counterparts, but they accept a pointer to a list of arguments
    instead of an argument list.

    ---end of non-documentation excerpt

    Of course, in all cases, the argument is clearly not declared as a
    pointer, so this confutzion probably arises from the way that va_arg
    processes the list, or something like that...

    > C has no way to "create an argument list" other than by
    > writing a function call in the source code. The call itself
    > is not in any sense "variable:" if you provide a string and
    > three int's when you write the call, that call will always
    > produce an argument list consisting of a string and three
    > int's. Nothing less, nothing more, and nothing else. Some
    > systems provide extra magic to allow fancier things, but these
    > incantations are "C with extras," not C.
    >

    Yes.

    > So, what use are the vxxxxx() functions? They're handy when
    > you want to write a function that behaves very much like one
    > of the ordinary xxxxx() functions, but does something a little
    > bit special. For example, you might want a function that is
    > "just like" printf() but sends its output to a logging stream
    > as well as to stdout.


    Yeah, the typical "professional" uses I've seen usually are handling
    some type of multiple formatting and output of error conditions...

    >The signature should be
    >
    > int doubleprint(const char *format, ...);
    >
    > like printf(), but how will you actually write the function?
    > Do you need to write what amounts to a complete printf() format
    > interpreter just to implement your special logger?
    >
    > vprintf() and vfprintf() to the rescue. You write something
    > like
    >
    > int doubleprint(const char *format, ...) {
    > int result;
    > va_list ap;
    >
    > /* print to stdout: */
    > va_start(ap, format);
    > vprintf(format, ap);
    > va_end(ap);
    >
    > /* ... and now to the log: */
    > va_start(ap, format);
    > result = vfprintf(logstream, format, ap);
    > va_end(ap);
    >
    > return result;
    > }
    >
    > (I say "something like" because it's not entirely clear what
    > value to return if you get an I/O error writing to one stream
    > while output to the other succeeds -- but that's a separate
    > issue.) There is no way doubleprint() can pass its own "..."
    > arguments to printf() or fprintf(), but it *can* latch onto
    > them with a va_list and pass *that* instead.
    >
    > Other likely uses: Adding time stamps or similar decorations
    > to output lines, "printing" to a buffer that will then be handed
    > to some service C's I/O doesn't support well (GUI dialog boxes,
    > perhaps), and anything else where you want a capability that is
    > similar to but a little different from that provided by a
    > variable-argument function in the Standard C library.
    >
    > > I actually posted an OFF-TOPIC example recently, using
    > > vsprintf(), that illustrates one "real-world" use:
    > > [...]

    >
    > This is a perfectly typical example of using a "printf-like"
    > function to create output for a non-printf-able destination (and
    > it seems adequately topical to me; no need to apologize for using
    > a vxxxxx() function as it is intended).
    >

    Well, in that case, let me make it off-topic (not to mention these
    functions are only "standard" in the largely unused "C99"):

    void print_console_buffer(unsigned new_line) {

    TextOutForm->TextOutput->Lines->Strings[printed_lines]=newline;

    if(new_line) {

    ...

    }

    void print_line_buffer(void) {
    unsigned char_idx=0;

    while(char_idx<LINEMAX) {
    if(next_char==console_width) {
    newline[next_char]=p_line_buffer[char_idx];
    newline[next_char+1]=NUL;
    next_char=0;
    print_console_buffer(NEWLINE);
    }

    else if(p_line_buffer[char_idx]=='\n') {

    ...

    }

    int gui_printf(char *format,...) {
    int print_length;

    p_line_buffer[0]=NUL;
    va_list ap;

    va_start(ap,format);
    vsprintf(p_line_buffer,format,ap);
    va_end(ap);

    print_length=(int)strlen(p_line_buffer);

    print_line_buffer();

    return print_length;
    }

    ---
    William Ernest Reid
    Bill Reid, Nov 18, 2006
    #6
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Nut Cracker
    Replies:
    1
    Views:
    333
  2. jakk
    Replies:
    4
    Views:
    12,052
  3. Tim Meagher
    Replies:
    8
    Views:
    1,281
    Karl Seguin
    Jun 18, 2005
  4. Johan
    Replies:
    2
    Views:
    399
    Victor Bazarov
    Jan 23, 2004
  5. titi

    if and and vs if and,and

    titi, Mar 9, 2007, in forum: VHDL
    Replies:
    4
    Views:
    571
    Mike Treseler
    Mar 11, 2007
Loading...

Share This Page