Article View: be.comp.programming
Article #1493Re: Printf: vaste lengte strings en ints?
From: moi
Date: Wed, 02 Mar 2005 10:24
Date: Wed, 02 Mar 2005 10:24
53 lines
3290 bytes
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-mailReferences:
<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