|
| trunkering af streng Fra : Morten Nørgaard |
Dato : 02-05-01 08:05 |
|
Hej -- igen....
er der nogen, der har en god kommando til at trunkere strenge med? Jeg
har en
char test[80];
som jeg læser til via en socket. Men -- jeg læser til strengen flere
gange, og når jeg sender resultatet videre kan der ske dét at noget af det
tidligere indlæste kommer i forlængelse af det nuværende, så der f.eks.
kommer til at stå noget i retning af
dette er en sætningætning
Eller noget i den retning. Så jeg har brug for at kunne trunkere strengen
(jeg kender længden, der skal trunkeres med), eller også bliver jeg nødt til
at rense min test-streng på en eller anden måde, før jeg læser fra min
socket.
Men ... hvordan renser man en pointer til en string? -- som test vel
egentlig er?
Alle gode forslag modtages med glæde,
Morten.
| |
Thorbjørn Ravn Ander~ (02-05-2001)
| Kommentar Fra : Thorbjørn Ravn Ander~ |
Dato : 02-05-01 08:21 |
|
"Morten Nørgaard" wrote:
> char test[80];
>
> som jeg læser til via en socket. Men -- jeg læser til strengen flere
> gange, og når jeg sender resultatet videre kan der ske dét at noget af det
> tidligere indlæste kommer i forlængelse af det nuværende, så der f.eks.
> kommer til at stå noget i retning af
>
> dette er en sætningætning
Husker du at sætte et \0 tegn efter sidste tegn du har indlæst?
--
Thorbjørn Ravn Andersen "...plus... Tubular Bells!"
http://bigfoot.com/~thunderbear
| |
Morten Nørgaard (02-05-2001)
| Kommentar Fra : Morten Nørgaard |
Dato : 02-05-01 10:30 |
|
"Thorbjørn Ravn Andersen" <thunderbear@bigfoot.com> wrote in message
news:3AEFB575.D6F144EA@bigfoot.com...
> "Morten Nørgaard" wrote:
>
> > char test[80];
> >
> > som jeg læser til via en socket. Men -- jeg læser til strengen flere
> > gange, og når jeg sender resultatet videre kan der ske dét at noget af
det
> > tidligere indlæste kommer i forlængelse af det nuværende, så der f.eks.
> > kommer til at stå noget i retning af
> >
> > dette er en sætningætning
>
> Husker du at sætte et \0 tegn efter sidste tegn du har indlæst?
>
Hej Thorbjørn,
nej, det har jeg ikke overvejet, men jeg tror at du er inde på noget.
Jeg kører Linux, skal det siges; bør jeg slutte strengen af med '\n', eller
'\0'? Sidstnævnte har jeg ikke stiftet bekendtskab med før nu.
| |
Bertel Lund Hansen (02-05-2001)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 02-05-01 11:10 |
|
Morten Nørgaard skrev:
> nej, det har jeg ikke overvejet, men jeg tror at du er inde på noget.
>Jeg kører Linux, skal det siges;
Det er ligemeget. C er C.
>bør jeg slutte strengen af med '\n'
Nej.
>eller '\0'?
Det er det eneste der virker. C bruger nulterminerede strenge.
Hvis du f.eks. har:
char *linje = "Dette er en streng!"
printf(linje);
Udskrift: Dette er en streng!
og skriver:
linje[8] = 0; // virker som '\0'
printf(linje);
Får du:
Udskrift: Dette er
--
Bertel
http://lundhansen.dk/bertel/ FIDUSO: http://fiduso.dk/
| |
Morten Nørgaard (02-05-2001)
| Kommentar Fra : Morten Nørgaard |
Dato : 02-05-01 12:13 |
|
> Det er ligemeget. C er C.
Jeg glemte vist at nævne at jeg bruger c++. Men det skulle vel ikke gøre
nogen forskel?
> Hvis du f.eks. har:
>
> char *linje = "Dette er en streng!"
> printf(linje);
>
> Udskrift: Dette er en streng!
>
> og skriver:
>
> linje[8] = 0; // virker som '\0'
> printf(linje);
>
> Får du:
> Udskrift: Dette er
>
Det lyder godt, det må jeg prøve. Tak for hjælpen,
Morten.
| |
Bertel Lund Hansen (02-05-2001)
| Kommentar Fra : Bertel Lund Hansen |
Dato : 02-05-01 12:23 |
|
Morten Nørgaard skrev:
>Jeg glemte vist at nævne at jeg bruger c++. Men det skulle vel ikke gøre
>nogen forskel?
Det tror jeg ikke (ved ikke så meget om C++). Du kan hurtigt
teste det ved at smide et nul midt ind i en streng og så udskrive
den. Det er en lille lærerig øvelse.
--
Bertel
http://lundhansen.dk/bertel/ FIDUSO: http://fiduso.dk/
| |
Kent Friis (02-05-2001)
| Kommentar Fra : Kent Friis |
Dato : 02-05-01 19:21 |
|
Den Wed, 2 May 2001 13:13:26 +0200 skrev Morten Nørgaard:
>
>> Det er ligemeget. C er C.
>
>Jeg glemte vist at nævne at jeg bruger c++. Men det skulle vel ikke gøre
>nogen forskel?
Jo da. I C++ bruger man std::string, hvor man i C bruger char[]...
Stor forskel.
Mvh
Kent
--
Nu med en e-mail adresse der virker...
| |
Richard Flamsholt (02-05-2001)
| Kommentar Fra : Richard Flamsholt |
Dato : 02-05-01 22:30 |
|
Bertel Lund Hansen <nospamto@lundhansen.dk> skrev:
> char *linje = "Dette er en streng!"
> linje[8] = 0; // virker som '\0'
> printf(linje);
>
>Får du:
>Udskrift: Dette er
Hvis man er "heldig", ja. Men det er faktisk ukorrekt kode.
I dit eksempel peger linie nemlig på en konstant streng: dens indhold må
ikke modificeres. Strengen kan fx ligge i et read-only RAM segment eller
i ROM, hvis vi taler om embeddede systemer. Dit eksempel kan derfor føre
til et crash. Se evt <URL: http://www.eskimo.com/~scs/C-faq/q16.6.html>
Bemærk, at sagen stiller sig anderledes i Mortens aktuelle eksempel. Han
har nemlig en "char test[80]". Det er ikke en pointer til en streng, men
derimod et navngivet array på 80 bytes. De bytes må man hjertens gerne
modificere, fx ved at skrive et 0 i test[8].
--
Richard Flamsholt
richard@flamsholt.dk - www.richard.flamsholt.dk
| |
Thorbjoern Ravn Ande~ (02-05-2001)
| Kommentar Fra : Thorbjoern Ravn Ande~ |
Dato : 02-05-01 13:33 |
|
| |
Morten Nørgaard (02-05-2001)
| Kommentar Fra : Morten Nørgaard |
Dato : 02-05-01 14:08 |
| | |
Igor V. Rafienko (02-05-2001)
| Kommentar Fra : Igor V. Rafienko |
Dato : 02-05-01 13:21 |
|
* Morten Nørgaard
[snip]
> char test[80];
Det er direkte dustete å bruke char*/char[] i C++. std::string er a
priori et _mye_ bedre valg, der du slipper nettopp den typen
problemstillinger som du sitter med nå.
[snip]
> Alle gode forslag modtages med glæde,
Du fikk allerede et tips om '\0'. Bare en advarsel -- dersom
innkommende data kan ha '\0'-byte i seg (hvilket ikke er så veldig
uvanlig), vil du få store problemer med å håndtere det ordentlig.
Den Riktige[tm] framgangsmåten i dette tilfellet ville ha vært å bygge
en stream_buffer klasse over socket-rammeverket, slik at du kunne lese
strenger slik du gjør det fra en vanlig fil. Jeg har lekt litt med
tanken selv, men har aldri funnet tid til å lese "Standard C++ IO
Streams and Locales" og/eller lage noe sånt. Det bør imidlertid være
en implementasjon av dette hos <URL: http://www.boost.org/>.
ivr
--
The only "intuitive" interface is the nipple. After that, it's all learned.
(Bruce Ediger, bediger@teal.csn.org, in comp.os.linux.misc, on X interfaces.)
| |
Morten Nørgaard (02-05-2001)
| Kommentar Fra : Morten Nørgaard |
Dato : 02-05-01 14:07 |
|
>
> Det er direkte dustete å bruke char*/char[] i C++. std::string er a
> priori et _mye_ bedre valg, der du slipper nettopp den typen
> problemstillinger som du sitter med nå.
Det er nok muligt, men hvis man sidder med socket-programmering har man et
begrænset valg, har jeg fundet.
> Du fikk allerede et tips om '\0'. Bare en advarsel -- dersom
> innkommende data kan ha '\0'-byte i seg (hvilket ikke er så veldig
> uvanlig), vil du få store problemer med å håndtere det ordentlig.
Det bliver ikke det store problem; Jeg har pæn kontrol over de strenge jeg
sender afsted.
> Den Riktige[tm] framgangsmåten i dette tilfellet ville ha vært å bygge
> en stream_buffer klasse over socket-rammeverket, slik at du kunne lese
> strenger slik du gjør det fra en vanlig fil. Jeg har lekt litt med
> tanken selv, men har aldri funnet tid til å lese "Standard C++ IO
> Streams and Locales" og/eller lage noe sånt. Det bør imidlertid være
> en implementasjon av dette hos <URL: http://www.boost.org/>.
Tak for linket,
Morten.
| |
Igor V. Rafienko (02-05-2001)
| Kommentar Fra : Igor V. Rafienko |
Dato : 02-05-01 14:28 |
|
* Morten Nørgaard
[snip the usual char* vs. string mantra]
> Det er nok muligt, men hvis man sidder med socket-programmering har
> man et begrænset valg, har jeg fundet.
Egentlig ikke, men med sockets blir det større andel av "egeninnsats".
ivr
--
The only "intuitive" interface is the nipple. After that, it's all learned.
(Bruce Ediger, bediger@teal.csn.org, in comp.os.linux.misc, on X interfaces.)
| |
Richard Flamsholt (02-05-2001)
| Kommentar Fra : Richard Flamsholt |
Dato : 02-05-01 22:35 |
|
"Morten Nørgaard" <martinnorgard@mail.tele.dk> skrev:
> char test[80];
>
> en pointer til en string? -- som test vel egentlig er?
Andre har allerede svaret på dit egentlige spørgsmål. Lad mig derfor, nu
jeg alligevel havde C-FAQ'en fremme i min browser, fortælle hvor du kan
læse hvorfor ovenstående er forkert, dvs hvorfor char test[80] _ikke_ er
en pointer:
<URL: http://www.eskimo.com/~scs/C-faq/q6.2.html>
--
Richard Flamsholt
richard@flamsholt.dk - www.richard.flamsholt.dk
| |
Morten Nørgaard (03-05-2001)
| Kommentar Fra : Morten Nørgaard |
Dato : 03-05-01 12:16 |
|
> > en pointer til en string? -- som test vel egentlig er?
>
> Andre har allerede svaret på dit egentlige spørgsmål. Lad mig derfor, nu
> jeg alligevel havde C-FAQ'en fremme i min browser, fortælle hvor du kan
> læse hvorfor ovenstående er forkert, dvs hvorfor char test[80] _ikke_ er
> en pointer:
>
Jeg lærer noget hver dag, lader det til. Tak for råd og link,
Morten.
| |
|
|