🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: be.comp.programming
Article #9341

Re: printf() en strings

#9341
From: Luc Kumps
Date: Tue, 30 Apr 2002 13:53
51 lines
2962 bytes
"Kris Gaethofs" <kris.gaethofs@student.kuleuven.ac.be> wrote in message
news:3CCE8BAB.20809@student.kuleuven.ac.be...
> Hoi,
>
> Ik heb een klein programma geschreven in C en zit nu met een
> probleempje. Ik definieer een pointer als volgt:
>
> char *string;

Dit reserveert een aantal bytes voor een pointer (waarschijnlijk 4).
Deze pointer wordt niet ge�nitialiseerd.

>
> Vervolgens lees ik uit een bestand in als volgt:
>
> fscanf(inputfile,"%lf%lf%lf%s",&x,&y,&z,&string);

Vermits je &string doorgeeft aan fscanf, zal de POINTER overschreven worden
door de character string die van de file ingelezen wordt.
Na deze instructie point de pointer string dus naar een geheugenlocatie,
waarvan het adres gegeven wordt door de eerste 4 characters van de ingelezen
string. De geheugenlocaties die zich bevinden na de pointer "string" worden
overschreven indien de ingelezen string langer is dan 3 characters (want er
is ook plaats nodig voor de 0).
Nu heeft de pointer dus een waarde, maar die zal waarschijnlijk niet naar
een geldige geheugenlocatie pointen ;-)

>
> Dit verloopt blijkbaar zonder fouten. De vraag is nu hoe ik de inhoud
> van string kan afdrukken. Wanneer ik hetvolgende probeer:
>
> printf("%s",string);
>
> krijg ik een core dump. Waarschijnlijk zal ik wel iets fout hebben
> gedaan met diene pointer, maar als beginnende c programmeur kom ik er
> toch nie dadelijk uit.

Zoals hierboven uitgelegd point string nu naar een zeer rare locatie.

Ofwel zal je dus een vaste buffer moeten reserveren, en ervan uitgaan dat de
input file te vertrouwen is (=nooit de lengte van de vaste buffer
overschrijdt). Bv.
char string[10000];

Ofwel zul je zelf character per character moeten inlezen, en voldoende
geheugen alloceren, en desnoods uitbreiden.
Ofwel kun je overschakelen naar C++, en de standaard iostreams en string
implementatie ��n en ander voor jou laten doen.

Luc
Technical Details
Message-ID: <Ilxz8.47067$Ze.7575@afrodite.telenet-ops.be>
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-01!supernews.com!newsfeed.online.be!skynet.be!skynet.be!ossa.telenet-ops.be!afrodite.telenet-ops.be.POSTED!not-for-mail
References: <3CCE8BAB.20809@student.kuleuven.ac.be>

Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII
X-Google-Thread: fcea4,4cf3e2e3be91fbcb
X-Google-Attributes: gidfcea4,public
X-Google-ArrivalTime: 2002-04-30 06:53:45 PST
Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-02!sn-xit-01!supernews.com!newsfeed.online.be!skynet.be!skynet.be!ossa.telenet-ops.be!afrodite.telenet-ops.be.POSTED!not-for-mail
From: "Luc Kumps" <NOkumpsSPAM@pandora.be>
Newsgroups: be.comp.programming
References: <3CCE8BAB.20809@student.kuleuven.ac.be>
Subject: Re: printf() en strings
Lines: 54
X-Priority: 3
X-MSMail-Priority: Normal
X-Newsreader: Microsoft Outlook Express 6.00.2600.0000
X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000
Message-ID: <Ilxz8.47067$Ze.7575@afrodite.telenet-ops.be>
Date: Tue, 30 Apr 2002 13:53:44 GMT
NNTP-Posting-Host: 213.118.66.64
X-Complaints-To: abuse@telenet.be
X-Trace: afrodite.telenet-ops.be 1020174824 213.118.66.64 (Tue, 30 Apr 2002 15:53:44 MET DST)
NNTP-Posting-Date: Tue, 30 Apr 2002 15:53:44 MET DST
Organization: Telenet Internet