/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
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


> Emnet er godt beskrevet i Kernigan og Richie lærebogen, men hvis du ikke
> lige har den hjemme så kig forbi
>
>
> http://www.cs.cf.ac.uk/Dave/C/node19.html#SECTION001900000000000000000
>

Jeg fik en del ud af den. Skulle have haft den at se til for længe siden,
men bedre sent end aldrig.

Tak for linket,

Morten.




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.




Søg
Reklame
Statistik
Spørgsmål : 177501
Tips : 31968
Nyheder : 719565
Indlæg : 6408522
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste