🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: be.comp.programming
Article #1493

Re: Printf: vaste lengte strings en ints?

#1493
From: moi
Date: Wed, 02 Mar 2005 10:24
53 lines
3290 bytes
Dr.Ruud wrote:
> Wat Aquila schreef, bleek het
> begin  van iets moois; kijk zelf maar:
> 
> 
>>In een stukje logging code gebruik ik volgend commando:
>>sprintf(buffer, "%s %.9f _%i_ --- %i %i ------- [%i:%i] (%s) %s",
>>event, timeval2double(now), id, pid, length, nid, dst_i, message,
>>additional)
> 
> 

>>[...]
>>Kan %i een maximum lengte opleggen zonder daarvoor extra nullen te
>>printen? In beide gevallen mag er afgekapt worden, ik wil gewoon
>>beveiligingsfouten vermijden.
> 
> 
> Nee, maar je zou wel kunnen casten, bijvoorbeeld
>   (int32) id
> want op die manier weet je dat %i maximaal 10 tekens kan opleveren,
> zelfs als later 'id' een 64-bits integer zou worden.
> 

Is wel erg paranoide, IMO, om rekening te houden met andere sizes.
En onsmakelijk om daar een cast voor te gebruiken.
Een int is een int. een "%d" of "%i" verwijst naar een int in de 
arglist, ongeacht zijn/haar sizeof.

Het eenvoudigst, IMHO is om de buffer gewoon groot genoeg te maken:
een geformatteerde 32 bits int vergt 10 char +1 voor het teken.
<limits.h> vermeldt:

#  if __WORDSIZE == 64
#   define LONG_MAX     9223372036854775807L
#  else
...
Dat is 19 pos + teken voor een 64bits int, als ik goed geteld hebt.

Samenvattend:
* (over)Alloceren op de stack ("auto") kost vrijwel niks. (je moet het
    natuurlijk niet in ieder functie doen, en dan duizenden lagen diep.
* voor strings is "%20s" nodig om maximaal 20 chars af te beelden.
* voor ints (en floats, in mindere mate) ligt het maximaal benodigde
   min-of-meer vast.

* Als levensverzekering zijn vsprintf(), en vsnprintf() uiterst
   bruikbaar. Problematisch is wel dat ze nog steeds niet op alle
   platformen beschikbaar zijn. (meestal zijn ze er wel, ergens diep
   in het hart van de library, maar alleen niet publiek zichtbaar)

HTH,
AvK
Technical Details
Message-ID: <CqudnXnc_MjnCbjfRVnyhg@casema.nl>
Path: arc1-ca.pugleaf.net!g2news1.google.com!news3.google.com!news.glorb.com!border1.nntp.dca.giganews.com!nntp.giganews.com!local01.nntp.dca.giganews.com!nntp.casema.nl!news.casema.nl.POSTED!not-for-mail
References: <M5qdnYvpZutbs7nfRVnyjA@scarlet.biz> <d01i4u.14c.1@news.isolution.nl>

Show Full Headers
Complete Article Headers
X-Google-Thread: fcea4,f962124bbb04ff22
X-Google-Thread: 107324,f962124bbb04ff22
X-Google-Attributes: gidfcea4,gid107324,public
X-Google-Language: DUTCH,ASCII-7-bit
Path: arc1-ca.pugleaf.net!g2news1.google.com!news3.google.com!news.glorb.com!border1.nntp.dca.giganews.com!nntp.giganews.com!local01.nntp.dca.giganews.com!nntp.casema.nl!news.casema.nl.POSTED!not-for-mail
NNTP-Posting-Date: Wed, 02 Mar 2005 04:24:58 -0600
Date: Wed, 02 Mar 2005 11:24:58 +0100
From: moi <avk@localhost>
User-Agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.6) Gecko/20040510
X-Accept-Language: en-us, en
MIME-Version: 1.0
Newsgroups: be.comp.programming,nl.comp.programmeren
Subject: Re: Printf: vaste lengte strings en ints?
References: <M5qdnYvpZutbs7nfRVnyjA@scarlet.biz> <d01i4u.14c.1@news.isolution.nl>
In-Reply-To: <d01i4u.14c.1@news.isolution.nl>
Content-Type: text/plain; charset=us-ascii; format=flowed
Content-Transfer-Encoding: 7bit
Message-ID: <CqudnXnc_MjnCbjfRVnyhg@casema.nl>
Lines: 53
NNTP-Posting-Host: 83.83.6.100
X-Trace: sv3-3YVKXjQDEjrlSloW3hKC9FjAC26nykL+Ct8fIw9/ccZdUQcGqnzQnQqjm9uAcLxuon+nyKRu8wiG3hv!3VdX+ac8SUlwEU/XnMRJzirwfecaYMwjsqxeMVJMXzhRejDzQ9tZba9hnOgWr92HZaE=
X-Complaints-To: abuse@casema.nl
X-DMCA-Complaints-To: abuse@casema.nl
X-Abuse-and-DMCA-Info: Please be sure to forward a copy of ALL headers
X-Abuse-and-DMCA-Info: Otherwise we will be unable to process your complaint properly
X-Postfilter: 1.3.32