|
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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
| |
![](/images/tree/0.gif) Socketd (21-09-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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 ![Blink](images/smileys/wink.gif) .
Med venlig hilsen, og fortsat god fornøjelse med C++,
Bjarke Ebert
| |
Claus Rasmussen (22-09-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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
| |
![](/images/tree/0.gif) Bjarke Dahl Ebert (22-09-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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
| |
![](/images/tree/0.gif) ![](/images/tree/0.gif) Ivan Johansen (22-09-2002)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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: ![Rækker Tunge](images/smileys/ntongue_ring.gif) erator[]().
Hvor mange andre sprog kan man vælge mellem hastighed og sikkerhed?
Ivan Johansen
| |
|
|