Article View: be.comp.programming
Article #1494Re: Printf: vaste lengte strings en ints?
From: John Bokma
Date: Wed, 02 Mar 2005 15:00
Date: Wed, 02 Mar 2005 15:00
61 lines
2951 bytes
2951 bytes
moi wrote:
> 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.
Nee, zeer zeker niet.
> 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:
Tja, en dat is? Het duidelijkste is om de afmeting van de buffer te
baseren op de maximaal mogelijke afmeting.
> Dat is 19 pos + teken voor een 64bits int, als ik goed geteld hebt.
Te veel bugs zijn van de "als ik goed" vorm :-(
> 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.
Wat gebeurd er als ik een string van 30 tekens heb?
> * voor ints (en floats, in mindere mate) ligt het maximaal benodigde
> min-of-meer vast.
Nee: het ligt vast vzviw.
--
John Bokma
Voorbeeldscripts in Perl: http://johnbokma.com/perl/
Ervaren Perl / Java programmeur beschikbaar: http://castleamber.com/
Tevreden opdrachtgevers: http://castleamber.com/testimonials.html
Technical Details
Message-ID:
<Xns960D5B9AC5FAcastleamber@130.133.1.4>Path:
arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mailReferences:
<M5qdnYvpZutbs7nfRVnyjA@scarlet.biz> <d01i4u.14c.1@news.isolution.nl> <CqudnXnc_MjnCbjfRVnyhg@casema.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!news1.google.com!fu-berlin.de!uni-berlin.de!individual.net!not-for-mail
From: John Bokma <postmaster@castleamber.com>
Newsgroups: be.comp.programming,nl.comp.programmeren
Subject: Re: Printf: vaste lengte strings en ints?
Date: 2 Mar 2005 15:00:18 GMT
Organization: Castle Amber - software development
Lines: 61
Message-ID: <Xns960D5B9AC5FAcastleamber@130.133.1.4>
References: <M5qdnYvpZutbs7nfRVnyjA@scarlet.biz> <d01i4u.14c.1@news.isolution.nl> <CqudnXnc_MjnCbjfRVnyhg@casema.nl>
X-Trace: individual.net O8VDCTIFLF5qN41BT3YFKg07JkTiSpbCz3QPMisP+1lrlxfDuC
User-Agent: Xnews/5.04.25
X-Face: $7h&5K*ZL9*ZQ\6Hco2"V?1dD*C<ab^>zlws[S%i0b,@gKk|[,)Y-<hk143{.Ov"x{({zo( l,N\m`-_^nJfVQdEyt+-uAP^7WG]5mHj9&::7X-qK;Yv;xmRvNWQR"_igw+cr5WMj;6:zlj<R80Ei@ $gGWq&*{FL*kC*a