Article View: be.comp.programming
Article #6987Re: Lege string geeft rommel
From: Roel Schroeven
Date: Wed, 30 Oct 2002 13:32
Date: Wed, 30 Oct 2002 13:32
42 lines
3120 bytes
3120 bytes
Aquila wrote:
> In een eenvoudig programmaatje in C++ moest ik in een functie, met als
> returntype een string, een char returnen. Omdat gewoon een char
> returnen kennelijk niet lukt, probeerde ik
> return "" + c; // forceren die conversie door concatenatie
> Dat gaf echter telkens heel rare strings die uit die lege string leken
> te komen (bijv CREATE). Als ik echter met een tempvariabele werk:
> string tmp = "";
> tmp += c;
> return tmp;
> krijg ik die rare strings niet. Mag je dan niet werken met die lege
> string om te returnen?
> Ik heb op een solaris getest met zowel een sun compiler als de gcc,
> het is dus geen specifieke bug (hoop ik).
Je probeert een char, c, te converteren naar een string door hem op te
tellen bij een lege string. Maar string en string is twee. "" is een
lege string, maar is eigenlijk een char pointer naar een stukje geheugen
waar \0 staat om de string af te sluiten. De string die het returntype
is van je functie daarentegen is de string uit de standard C++ library.
"" + c wordt ge�nterpreteerd als (erfenis van C) de string die begint c
plaatsen verder dan je lege string. Wat daar staat is totaal
ongedefinieerd, je hebt nog geluk dat je programma er niet op crasht.
Geen wonder dat er rare strings uit komen.
Wat je zou kunnen doen is die lege string omzetten naar een std::string:
return string("") + c;
en dan zou het wel goed werken. Het verwondert me ietwat dat std::string
geen constructor heeft om een char om te zetten in een string, dat zou
handiger zijn.
Best is, denk ik, zoals je zelf al zei je char op te tellen bij een lege
string, maar dan met een C++-style lege string ipv een C-style lege string:
return string() + c;
Je methode met de tempvariabele werkt wel omdat
string tmp = "";
de conversie van char* naar string voor je doet.
--
"Codito ergo sum"
Roel Schroeven
Technical Details
Message-ID:
<pbRv9.186644$8o4.29953@afrodite.telenet-ops.be>Path:
arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-03!sn-xit-06!sn-xit-08!supernews.com!news-out.visi.com!hermes.visi.com!newsfeed.gamma.ru!Gamma.RU!skynet.be!skynet.be!ossa.telenet-ops.be!afrodite.telenet-ops.be.POSTED!not-for-mailReferences:
<2cmvru4dmo0kat63e6egkhsr5l9dpvdoc9@4ax.com>Show Full Headers
Complete Article Headers
X-Google-Language: DUTCH,ASCII X-Google-Thread: fcea4,73abf75edf841281 X-Google-Attributes: gidfcea4,public X-Google-ArrivalTime: 2002-10-30 05:36:07 PST Path: arc1-ca.pugleaf.net!archiver1.google.com!news1.google.com!sn-xit-03!sn-xit-06!sn-xit-08!supernews.com!news-out.visi.com!hermes.visi.com!newsfeed.gamma.ru!Gamma.RU!skynet.be!skynet.be!ossa.telenet-ops.be!afrodite.telenet-ops.be.POSTED!not-for-mail From: Roel Schroeven <ed5wcylnn2001@sneakemail.com> User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.2b) Gecko/20021016 X-Accept-Language: nl-be, nl, en, en-us MIME-Version: 1.0 Newsgroups: be.comp.programming Subject: Re: Lege string geeft rommel References: <2cmvru4dmo0kat63e6egkhsr5l9dpvdoc9@4ax.com> In-Reply-To: <2cmvru4dmo0kat63e6egkhsr5l9dpvdoc9@4ax.com> Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 8bit Lines: 43 Message-ID: <pbRv9.186644$8o4.29953@afrodite.telenet-ops.be> Date: Wed, 30 Oct 2002 13:32:05 GMT NNTP-Posting-Host: 213.224.38.161 X-Complaints-To: abuse@telenet.be X-Trace: afrodite.telenet-ops.be 1035984725 213.224.38.161 (Wed, 30 Oct 2002 14:32:05 MET) NNTP-Posting-Date: Wed, 30 Oct 2002 14:32:05 MET Organization: Telenet Internet