/ 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
Typen string
Fra : mousling


Dato : 31-10-02 20:02

Jeg er nybegynder i C++ - programmerer i Delphi til dagligt - og er en smule
forvirret... Kan det passe at der ikke er en "normal" string type i C++. Når
jeg skal bruge en string skal jeg så skrive Char[50] eksempelvis??? På mig
virker det en smule besværligt - og håber derfor at der er noget jeg har
misforstået... Håber at der er en der kan hjælpe med en god forklaring ;0)



 
 
Mads Orbesen Troest (31-10-2002)
Kommentar
Fra : Mads Orbesen Troest


Dato : 31-10-02 20:27

> forvirret... Kan det passe at der ikke er en "normal" string type i C++.
Når
> jeg skal bruge en string skal jeg så skrive Char[50] eksempelvis???

Nej, det kan ikke passe. :) I hvert fald kun hvis det er en meget gammel
compiler du har (og så kan STLport nok hjælpe dig). ANSI C++
standardbiblioteket har typen "string" der ligger i "std" namespacet. Det du
anfører er den gamle C måde at lave "streng"-behandling på - her arbejder
man basalt set på 0-terminerede arrays a type char. Det virker fint men er,
som du skriver, lidet elegant. Især taget i betragtning hvor stor mænge
tekst-behandling man tit laver i sin kode.

Nå, men:

#include <string>
#include <iostream>

int main()
{
std::string str( "Hej, mor!" );
std::cout << str << " (" << str.length() << ")" << std::endl;
};

/\/\\



Martin Moller Peders~ (31-10-2002)
Kommentar
Fra : Martin Moller Peders~


Dato : 31-10-02 20:36

In <3dc17e2d$0$97624$edfadb0f@dspool01.news.tele.dk> "mousling" <mouslingViki@ofir.dk> writes:

>Jeg er nybegynder i C++ - programmerer i Delphi til dagligt - og er en smule
>forvirret... Kan det passe at der ikke er en "normal" string type i C++. Når
>jeg skal bruge en string skal jeg så skrive Char[50] eksempelvis??? På mig
>virker det en smule besværligt - og håber derfor at der er noget jeg har
>misforstået... Håber at der er en der kan hjælpe med en god forklaring ;0)

Nej, der er en string klasse i C++. char[] er et array af chars og
er smart i nogle (faa) sammenhaenge.

Hvilke C++ boeger ejer du ? Der findes mange daarlige og nogle faa
ufattelige gode.

/Mvh
Martin




Torben W. Hansen (31-10-2002)
Kommentar
Fra : Torben W. Hansen


Dato : 31-10-02 22:46


"mousling" <mouslingViki@ofir.dk> skrev i en meddelelse
news:3dc17e2d$0$97624$edfadb0f@dspool01.news.tele.dk...
> Jeg er nybegynder i C++ - programmerer i Delphi til dagligt - og er en
smule
> forvirret... Kan det passe at der ikke er en "normal" string type i C++.
Når
> jeg skal bruge en string skal jeg så skrive Char[50] eksempelvis??? På mig
> virker det en smule besværligt - og håber derfor at der er noget jeg har
> misforstået... Håber at der er en der kan hjælpe med en god forklaring ;0)

Jeg vil lige gøre opmærksom på at jeg også er ny i C++ og at min forklaring
måske ikke 100% præcis. I C++ findes klassen "string" der håndterer strenge
på en mere elegant måde, som jeg ikke på nuværende tidspunkt har indsigt i.
Jeg vil derfor overlade denne forklaring til en af de mere skrappe C++ folk
og istedet skitsere den lidt ældre metode for strenge der gælder for både C
og C++.
Strenge eksisterer ikke som en decideret type, men man kan, ganske rigtigt
som du selv skrev, erklære et array af karakterer således:

char streng[50];

Læses noget i retning af "Et array af - karakterer - med navnet streng - på
50 elementer".
Man kan initialisere arrayet ved erklæring, med eller uden antallet af
elementer, på denne måde:

char streng[50] = "Hans";
char streng[] = "Hans";

I første eksempel reserveres 50 elementer selvom der bruges et mindre antal,
og i andet eksempel reserveres kun det nødvendige antal som er antallet af
tegn+1. Arrays af karakterer, der initialiseres med anførselstegn som vist
ovenfor, får af compileren hægtet et slut-på-streng-tegn på, der har
Ascii-værdien 0 og som skrives \0. Dvs. at der i virkligheden står følgende
karaktere 'H', 'a', 'n', 's', '\0'. Hvis man ønsker at tildele en ny værdi
til streng kan det bl.a. gøres som nedenfor:

strcpy(streng, "Bo")

eller sammensætte to strenge

strcat(streng, "bedre")

Antallet af elementer i streng skal være stort nok til at rumme strengen+1.
Hvis dette glemmes overskrives eventuelle variable der er allokeret efter
streng.
Der en vigtig sammenhæng mellem arrays og pointere; f.eks. læses udtrykket
&streng[0] som:
Adressen på element 0 i arrayet streng. Sammenhængen består i at &streng[0]
ganske enkelt kan skrives som streng, hvilket bl.a. udnyttes i eksemplerne
strcpy() og strcat() ovenfor.

Programeksempel:

#include <string>

int main()
{
char streng[50] = "Grete"; // Erklærer og initialiserer streng med
"Grete"
std::cout << streng << "\n\n"; // Udskriv streng efterfulgt af to
linieskift

std::strcpy(streng, "Hans"); // Kopierer "Hans" over i streng
std::cout << streng << "\n\n"; // Udskriv streng efterfulgt af to
linieskift

std::strcat(streng, " og Grete"); // Tilføjer "og Grete" til streng
std::cout << streng << "\n\n"; // Udskriv streng efterfulgt af to
linieskift

return 0;
}


Med venlig hilsen
Torben W. Hansen




Mads Orbesen Troest (31-10-2002)
Kommentar
Fra : Mads Orbesen Troest


Dato : 31-10-02 23:36

Hej Torben;

Jeg vil bare lige være en pedant og præcicere et par ting i dit svar
yderligere. :)

> I C++ findes klassen "string" der håndterer strenge

Og "string" er, ud over at være en klasse, som du siger, en parametriseret
instans af templaten basic_string<>.

> Strenge eksisterer ikke som en decideret type,

"string" er skam en decideret type. Klasser er typer. Det er dog ikke en
fundamental type i sproget, men en del af dets standard library.

/\/\\ads Orbesen Troest



Torben W. Hansen (01-11-2002)
Kommentar
Fra : Torben W. Hansen


Dato : 01-11-02 08:11


"Mads Orbesen Troest" <mads@troest.NEVERMORE.dk> skrev i en meddelelse
news:3dc1b003$0$11452$ba624c82@nntp02.dk.telia.net...

Hej igen Mads,

> Jeg vil bare lige være en pedant og præcicere et par ting i dit svar
> yderligere. :)
Det er bare helt okey - jeg skrev faktisk indlægget med den bagtanke at få
en debat igang.

> Og "string" er, ud over at være en klasse, som du siger, en parametriseret
> instans af templaten basic_string<>.
Er der noget let tilgængeligt stof på nettet (om muligt gerne dansk) omkring
"string" ?

> Klasser er typer. Det er dog ikke en
> fundamental type i sproget, men en del af dets standard library.
Det kan jeg kun give dig ret i.

Tak for korrektionerne...

Med venlig hilsen
Torben W. hansen



Torben Nielsen (02-11-2002)
Kommentar
Fra : Torben Nielsen


Dato : 02-11-02 10:31

On Fri, 01 Nov 2002 08:10:40 +0100, Torben W. Hansen wrote:

>
> "Mads Orbesen Troest" <mads@troest.NEVERMORE.dk> skrev i en meddelelse
> news:3dc1b003$0$11452$ba624c82@nntp02.dk.telia.net...
>
> Hej igen Mads,
>
>> Jeg vil bare lige være en pedant og præcicere et par ting i dit svar
>> yderligere. :)
> Det er bare helt okey - jeg skrev faktisk indlægget med den bagtanke at få
> en debat igang.
>
>> Og "string" er, ud over at være en klasse, som du siger, en parametriseret
>> instans af templaten basic_string<>.
> Er der noget let tilgængeligt stof på nettet (om muligt gerne dansk) omkring
> "string" ?

Kig evt. på Bruce Eckels "Thinking in c++" på www.mindview.net/Books

Svjh skriver han noget om string i bind 2 af bogen.

Torben

Michael Olsen (01-11-2002)
Kommentar
Fra : Michael Olsen


Dato : 01-11-02 17:22

> char streng[50];
>
> Læses noget i retning af "Et array af - karakterer - med navnet streng -

> 50 elementer".
> Man kan initialisere arrayet ved erklæring, med eller uden antallet af
> elementer, på denne måde:
>
> char streng[50] = "Hans";
> char streng[] = "Hans";


Hvornår bruger man så det ene eller andet.

#include <utility.h>
#include <ansi_c.h>

char *streng1 = "Hans1";
char streng2[] = "Hans2";
char streng3[10] = "Hans3";

int main (int argc, char *argv[])
{

Cls();
printf ("%s\n", streng1 );
printf ("%s\n", streng2 );
printf ("%s\n", streng3 );

return 0;
}
--
Hilsen
Michael



Mads Orbesen Troest (01-11-2002)
Kommentar
Fra : Mads Orbesen Troest


Dato : 01-11-02 21:58

Hej;

> Hvornår bruger man så det ene eller andet.

Det kommer jo lidt an på hvad man vil.

> char *streng1 = "Hans1";
> char streng2[] = "Hans2";
> char streng3[10] = "Hans3";

Førstnævnte bør undgås hvis du kan finde på at modificere strengen via en
pointer (streng1), da compileren typisk (i hvert fald når man bygger i
release mode med fuld optimering) flytter strenge til et readonly område
hvor identiske strenge derfor kan deles (om man vil tillade det kan dog
typisk kontrolleres med compiler-switches). Netop fordi det typisk kun sker
i release builds kan det give "morsomme" fejl (access violations) i kode der
ellers 'skulle virke' (og som virkede i debug mode). Dette sker ikke ved
løsning 2 og 3. I løsning bliver strengen lige så lang som
"Hans2"+terminerende 0 - man opnår altså det samme som løsning 1, dog uden
risiko for at compileren laver strengen read-only. Løsning 3 afsætter altid
10 chars, også selv om literal strengen er kortere (hvis du forsøger med en
længere streng får du en compile-time fejl).

/\/\\ads Orbesen Troest



Torben W. Hansen (02-11-2002)
Kommentar
Fra : Torben W. Hansen


Dato : 02-11-02 01:09

"Michael Olsen" <mfolsen@hotmail.com> skrev i en meddelelse
news:apuaju$54160$1@ID-145841.news.dfncis.de...

> Hvornår bruger man så det ene eller andet.
> char *streng1 = "Hans1";
> char streng2[] = "Hans2";
> char streng3[10] = "Hans3";

I tillæg til Mads' forklaring har jeg en tilføjelse:

char streng2[] og char streng3[] er begge er placeret i ram, da indholdet
kan ændres. Adressen af f.eks. streng2[] er givet ved streng2 (uden indeks)
eller som &streng2[0].

char *streng1 er en pointer der ligger i ram, som er initialiseret til at
pege på startadressen på første element i "Hans1" der ligger i
kode-segmentet og derfor ofte read only memory.
Imodsætning til streng2 og streng3 kan streng1 tildeles en ny addresse
f.eks. som streng1 = streng2;
"Hans1" eksisterer stadig, men streng1 peger bare ikke længere på denne.

Dit eksempel i modificeret form:

#include <stdio.h>

char *streng1 = "Hans1";
char streng2[] = "Hans2";

int main ()
{
printf ("%s\n", streng1 );
printf ("%s\n", streng2 );
streng1 = streng2; // pointer streng1 tildeles adressen streng2
printf ("%s\n", streng1 );
streng1 = "Hans1"; // pointer streng1 tildeles oprindelig adresse
printf ("%s\n", streng1 );
return 0;
}


Med venlig hilsen
Torben W. Hansen




Byrial Jensen (02-11-2002)
Kommentar
Fra : Byrial Jensen


Dato : 02-11-02 23:37

Torben W. Hansen <mail@ins-intersoft.com> skrev:
> "Michael Olsen" <mfolsen@hotmail.com> skrev i en meddelelse
>
>> Hvornår bruger man så det ene eller andet.
>> char *streng1 = "Hans1";
>> char streng2[] = "Hans2";
>> char streng3[10] = "Hans3";
>
> I tillæg til Mads' forklaring har jeg en tilføjelse:
>
> char streng2[] og char streng3[] er begge er placeret i ram, da indholdet
> kan ændres. Adressen af f.eks. streng2[] er givet ved streng2 (uden indeks)
> eller som &streng2[0].
>
> char *streng1 er en pointer der ligger i ram, som er initialiseret til at
> pege på startadressen på første element i "Hans1" der ligger i
> kode-segmentet og derfor ofte read only memory.

Dataene behøver nu ikke at ligge sammen med koden. De kunne også
ligge i et read-only data-segment, eller endda i et write-read
data-segment. Det er helt op til oversætteren, linkeren og
styresystemet. Det eneste der ligger fast, er at det er udefineret
adfærd at forsøge at ændre indholdet.

Hvis streng1 havde været erklæret

const char *streng1 = "Hans1";

kunne oversætteren have advaret mod forsøg på ændringer.

>Imodsætning til streng2 og streng3 kan streng1 tildeles en ny addresse
> f.eks. som streng1 = streng2;
> "Hans1" eksisterer stadig, men streng1 peger bare ikke længere på denne.
>
> Dit eksempel i modificeret form:
>
> #include <stdio.h>
>
> char *streng1 = "Hans1";
> char streng2[] = "Hans2";
>
> int main ()
> {
> printf ("%s\n", streng1 );
> printf ("%s\n", streng2 );
> streng1 = streng2; // pointer streng1 tildeles adressen streng2
> printf ("%s\n", streng1 );
> streng1 = "Hans1"; // pointer streng1 tildeles oprindelig adresse

Forkert. Når man skriver "Hans1" flere steder i programmet, må
oversætteren gerne bruge den samme streng med samme adresse, men den
behøver ikke at gøre det.

> printf ("%s\n", streng1 );
> return 0;
> }

--
Skal musik- og edb-industrien have ret til fratage forbrugerne deres
rettigheder i henhold til Ophavsretloven, begrænse konkurrencen og
fremme monopoldannelse ved hjælp af tekniske midler? Sig nej! Nu!
Støt underskriftsindsamlingen på http://www.digitalforbruger.dk

Torben W. Hansen (04-11-2002)
Kommentar
Fra : Torben W. Hansen


Dato : 04-11-02 11:41

"Byrial Jensen" <bjensen@nospam.dk> skrev i en meddelelse
news:slrnas8k6t.17r.bjensen@ask.ask...

> Her mener du #include <cstring>
><cstring> erklærer de strengfunktioner som C++ har arvet fra C, i
> eksemplet strcpy og strcat. <string> bruges til C++'s indbyggede
> string-type.
> Der mangler desuden en
> #include <iostream>
> for at kunne bruge std::cout.

Jeg tvivler ikke på at du har ret, men faktisk kunne jeg kompilere koden kun
med:
#include <string> uden
#include <iostream>
, der var nødvendig ved brug af
#include <cstring>.
Jeg bruger Dev C++ 4.01 der er baseret på compiler fra Mingw eller Cygwin.

> Dataene behøver nu ikke at ligge sammen med koden. De kunne også
> ligge i et read-only data-segment, eller endda i et write-read
> data-segment. Det er helt op til oversætteren, linkeren og
> styresystemet. Det eneste der ligger fast, er at det er udefineret
> adfærd at forsøge at ændre indholdet.
OK- Hvilke segmet-typer kan man tale om på PC-platformen, ud over kode-,
R/Wdata-, R/Odata- segmenterne (jeg kommer fra embedded u-controller
verdenen) ?

> Forkert. Når man skriver "Hans1" flere steder i programmet, må
> oversætteren gerne bruge den samme streng med samme adresse, men den
> behøver ikke at gøre det.
Enig - Jeg så fejlen umiddelbart efter at jeg havde ekspederet meddelelsen.
Eksemplet skulle have været:

char *streng1 = "Hans1";
char *streng1_kopi = streng1;
....
streng1 = streng1_kopi; // pointer streng1 tildeles oprindelig adresse
printf ("%s\n", streng1 );
....

Med venlig hilsen
Torben W. Hansen




Byrial Jensen (02-11-2002)
Kommentar
Fra : Byrial Jensen


Dato : 02-11-02 23:37

Torben W. Hansen <mail@ins-intersoft.com> skrev:
> Programeksempel:
>
> #include <string>

Her mener du

#include <cstring>

<cstring> erklærer de strengfunktioner som C++ har arvet fra C, i
eksemplet strcpy og strcat. <string> bruges til C++'s indbyggede
string-type.

Der mangler desuden en

#include <iostream>

for at kunne bruge std::cout.

--
Skal musik- og edb-industrien have ret til fratage forbrugerne deres
rettigheder i henhold til Ophavsretloven, begrænse konkurrencen og
fremme monopoldannelse ved hjælp af tekniske midler? Sig nej! Nu!
Støt underskriftsindsamlingen på http://www.digitalforbruger.dk

mousling (02-11-2002)
Kommentar
Fra : mousling


Dato : 02-11-02 10:23

Tak for nogle gode besvarelser... Jeg er meget glad for at typen string
findes - det gør jo det hele lidt lettere ;0). Jeg havde læst om det på
nettet men har nu fået fat i bogen: C++ Grundbog - så jeg håber at den er en
smule tydeligere i sine forklaringer.



Mogens Hansen (02-11-2002)
Kommentar
Fra : Mogens Hansen


Dato : 02-11-02 10:58


"mousling" <mouslingViki@ofir.dk> wrote in message
news:3dc39989$0$47244$edfadb0f@dspool01.news.tele.dk...


> ... men har nu fået fat i bogen: C++ Grundbog - så jeg håber at den er en
> smule tydeligere i sine forklaringer.

Når jeg kigger på bogens indholdsfortegnelse på nettet og på source-kode
eksemplerne fra nettet, kan jeg ikke set at "std::string" er nævnt.
Da du har fået bogen, kan du måske fortælle hvor i bogen klassen
"std::string" bliver brugt eller forklaret.

Venlig hilsen

Mogens Hansen



Torben W. Hansen (02-11-2002)
Kommentar
Fra : Torben W. Hansen


Dato : 02-11-02 11:53


"Mogens Hansen" <mogens_h@dk-online.dk> skrev i en meddelelse
news:aq07gc$1qq5$1@news.cybercity.dk...

> Da du har fået bogen, kan du måske fortælle hvor i bogen klassen
> "std::string" bliver brugt eller forklaret.

Jeg har købt bogen som en indledning til Accelerated C++ og er nået til
kapitel 5, men det ser ikke ud til at std::string bliver introduceret.
Udover at dette er en mangel, er jeg iøvrigt ikke i stand til at afgøre
bogens kvalitet, før jeg har læst flere C++ bøger. Det skal Dog er den
betydelig mere detaljeret, velskrevet og præcis end "Kris Jamsa C++".

Med venlig hilsen
Torben W. Hansen






Torben W. Hansen (02-11-2002)
Kommentar
Fra : Torben W. Hansen


Dato : 02-11-02 12:01

"Mogens Hansen" <mogens_h@dk-online.dk> skrev i en meddelelse
news:aq07gc$1qq5$1@news.cybercity.dk...

Jeg glemte at nævne at bogen er en oversættelse af "Sams Teach yourself C++
in 24 Houres", som du allerede gættede på ved tidligere lejlighed.

Med venlig hilsen
Torben W. Hansen



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408925
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste