/ 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
C++ strings (igen)
Fra : Socketd


Dato : 21-09-02 14:52

Hey igen

Så leger jeg med strings igen:

#include <iostream>
#include <string>

int main() {

string Navn = "Socketd";
cout<<"Navn = "<<Navn<<endl;
Navn[2] = 'k';
cout<<"Navn nu = "<<Navn<<endl;

string Test;
Test[0] = 'S';
Test[1] = 'o';
Test[2] = 'c';
Test[3] = 'k';
Test[4] = 'e';
Test[5] = 't';
Test[6] = 'd';
cout<<"Test = "<<Test<<endl;
return 0;
}

Dette program udskriver:
Navn = Socketd
Navn nu = Sokketd
Test =

Hvorfor kan "Test" ikke udskrives? Strings skal jo ikke slutte med '\0'.

mvh
socketd

 
 
Claus Rasmussen (21-09-2002)
Kommentar
Fra : Claus Rasmussen


Dato : 21-09-02 15:09

Socketd wrote:

> Så leger jeg med strings igen:

Først bør du nok sætte dig ind i, hvordan C++ string fungerer.
Der er en fremragende reference her:

http://www.sgi.com/tech/stl/

Man kan bla. læse:

Name Expression Precondition Semantics
-------------- ---------- ----------------- -----------------------
Element access a[n] 0 <= n < a.size() Returns the nth element
from the beginning of
the container.

Forudsætningen for at a[n] virker er altså, at n er mindre end
strengens længde. Din strengs længde er nul, og derfor er kaldet
udefineret.

-Claus


Ivan Johansen (21-09-2002)
Kommentar
Fra : Ivan Johansen


Dato : 21-09-02 15:21

Socketd wrote:
> string Test;

Test har en længde på 0.

> Test[0] = 'S';
Her indekserer du ud over enden. Standarden garanterer ikke at det
kontrolleres om indekset er ude over enden, og en std::string udvides
ikke ved indeksering ud over enden. Du skriver derfor et tilfældigt sted
i hukommelsen.

Su skal derfor sørge for at strengen er stor nok:
Test.resize(7);

Ivan Johansen



Ivan Johansen (21-09-2002)
Kommentar
Fra : Ivan Johansen


Dato : 21-09-02 15:24

Du kan for øvrigt også prøve at bruge at() i stedet:
Test.at(0) = 'S';

Den gør det samme som indeks-operatoren, bort set fra at den smider en
exception hvis der indekseres ud over enden.

Ivan Johansen


Socketd (21-09-2002)
Kommentar
Fra : Socketd


Dato : 21-09-02 15:37

On Sat, 21 Sep 2002 17:23:47 +0200, Ivan Johansen wrote:

> Du kan for øvrigt også prøve at bruge at() i stedet: Test.at(0) = 'S';
>
> Den gør det samme som indeks-operatoren, bort set fra at den smider en
> exception hvis der indekseres ud over enden.

oki, takker begge for jeres svar

mvh
db

Bjarke Dahl Ebert (22-09-2002)
Kommentar
Fra : Bjarke Dahl Ebert


Dato : 22-09-02 20:17

"Socketd" <db@traceroute.dk> wrote in message
news:pan.2002.09.21.13.52.08.519246.215@traceroute.dk...

> string Test;
> Test[0] = 'S';

Velkommen til en af C++'s mange, små glæder -
"oppe-i-programmørens-hoved"-check af array bounds.
Som nogen ved, er dette dog intet som helst problem i C++, for man kan bare
bruge Valgrind eller lignende værktøj .

Med venlig hilsen, og fortsat god fornøjelse med C++,
Bjarke Ebert





Claus Rasmussen (22-09-2002)
Kommentar
Fra : Claus Rasmussen


Dato : 22-09-02 20:23

Bjarke Dahl Ebert wrote:

> Med venlig hilsen, og fortsat god fornøjelse med C++,

FLOT !! Du undgik helt at nævne python som alternativ. Du gør
fremskridt, og det skal du bestemt have ros for.

Nu manger vi bare at du skruer en smule ned for sarkasmen og
hjælper den stakkels mand med en forklaring eller stiller det
forslag om dk.programmering.python, som jeg har anbefalet dig.

-Claus






Bjarke Dahl Ebert (22-09-2002)
Kommentar
Fra : Bjarke Dahl Ebert


Dato : 22-09-02 21:39

"Claus Rasmussen" <clr@cc-consult.dk> wrote in message
news:aml5b2$fpk$3@sunsite.dk...

> FLOT !! Du undgik helt at nævne python som alternativ. Du gør
> fremskridt, og det skal du bestemt have ros for.

Det var fordi stort set alle andre sprog end C++ (og C) ville håndtere
Test[0] = 'S'; bedre. Her er der ingen grund til specielt at fremhæve
Python.

> Nu manger vi bare at du skruer en smule ned for sarkasmen og
> hjælper den stakkels mand med en forklaring eller stiller det

Jeg kunne se at han allerede var hjulpet, så jeg ville såmænd bare slippe en
lille C++-vind på en fredelig søndag.

> forslag om dk.programmering.python, som jeg har anbefalet dig.

Stil dog selv det forslag hvis du synes det er vigtigt at vi får den gruppe.
Jeg synes at Python har det fint med dk.edb.programmering - en
dk.programmering.python gruppe ville der i hvert fald ikke være meget liv i,
hvis man kan dømme efter andelen af indlæg på dk.edb.programmering.

Mvh. Bjarke





Ivan Johansen (22-09-2002)
Kommentar
Fra : Ivan Johansen


Dato : 22-09-02 21:58

Bjarke Dahl Ebert wrote:
> Det var fordi stort set alle andre sprog end C++ (og C) ville håndtere
> Test[0] = 'S'; bedre. Her er der ingen grund til specielt at fremhæve
> Python.

Det samme gør visse implementationer af C++ standard library. For
eksempel STLport, der følger med BCB6, i debug mode. Desuden kan man jo
altid bruge std::string::at() i stedet for std::string:erator[]().
Hvor mange andre sprog kan man vælge mellem hastighed og sikkerhed?

Ivan Johansen


Søg
Reklame
Statistik
Spørgsmål : 177485
Tips : 31964
Nyheder : 719565
Indlæg : 6408407
Brugere : 218885

Månedens bedste
Årets bedste
Sidste års bedste