Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 05 Jan 2001 17:29:42 +0000
From:      Brian Somers <brian@Awfulhak.org>
To:        Ben Smithurst <ben@FreeBSD.org>
Cc:        Brian Somers <brian@Awfulhak.org>, Chris Faulhaber <jedgar@fxp.org>, Will Andrews <will@FreeBSD.org>, cvs-committers@FreeBSD.org, cvs-all@FreeBSD.org, brian@Awfulhak.org
Subject:   Re: cvs commit: src/usr.bin/apply apply.c 
Message-ID:  <200101051729.f05HTgi47555@hak.lan.Awfulhak.org>
In-Reply-To: Message from Ben Smithurst <ben@FreeBSD.org>  of "Fri, 05 Jan 2001 16:29:17 GMT." <20010105162917.K85794@strontium.scientia.demon.co.uk> 

next in thread | previous in thread | raw e-mail | index | archive | help
> Brian Somers wrote:
> 
> > Also (and this bug was already there), s[n]printf() returns the length 
> > of what it would have liked to have put in the target, not what it 
> > actually wrote.  If the first s[n]printf() above ends up truncating, 
> > the second one will happily overflow.
> 
> Well, with sprintf, there is no difference, since it doesn't have a size
> limitation like snprintf does.
> 
> > s[n]printf() is poorly documented in this area.
> 
> Would this change make you feel better?
> 
> change this:
> 
>      Snprintf() and vsnprintf() will write at most size-1 of the characters
>      printed into the output string (the size'th character then gets the ter-
>      minating `\0'); if the return value is greater than or equal to the size
>      argument, the string was too short and some of the printed characters
>      were discarded.
> 
> to this:
> 
>      Snprintf() and vsnprintf() will write at most size-1 of the characters
>      printed into the output string (the size'th character then gets the ter-
>      minating `\0'), and return the number of characters written to the
>      buffer, excluding the terminating `\0'.  This value may be less than the
>      number of characters which would have been written, had the buffer been
>      large enough; if the return value is greater than or equal to the size
>      argument, the string was too short and some of the printed characters
>      were discarded.

I guess this proves my point about the documentation being inadequate 
:-).  The return value is the amount that would have been written had 
there been enough space, *not* the amount that was actually written.

hak:~ $ cat x.c
#include <stdio.h>

int
main(int argc, char **argv)
{
  char x[5];
  int n;

  n = snprintf(x, sizeof x, "hello world");
  printf("Got \"%s\", %d\n", x, n);

  return 0;
}
hak:~ $ cc -o x x.c
hak:~ $ ./x
Got "hell", 11

> -- 
> Ben Smithurst / ben@FreeBSD.org / PGP: 0x99392F7D

-- 
Brian <brian@Awfulhak.org>                        <brian@[uk.]FreeBSD.org>
      <http://www.Awfulhak.org>;                   <brian@[uk.]OpenBSD.org>
Don't _EVER_ lose your sense of humour !




To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe cvs-all" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200101051729.f05HTgi47555>