[c++ BCB] std::string AnsiString String.. ?

Pagina: 1
Acties:
  • 102 views sinds 30-01-2008
  • Reageer

  • BdR
  • Registratie: Juni 2001
  • Laatst online: 03-09-2025

BdR

TV is gooder then books

Topicstarter
Ik zit wat met Borland C++ Builder te werken en is snap niks van al die verschillende string types. Van wat ik ervan heb begrepen zit het zo (correct me if i'm wrong):

std::string = standaard C string
AnsiString = standaard C++ string
String = standaard string van Borland C++Builder

Maar hoe "trim" en "uppercase" ik een std::string variabele?. En waarom kan ik niet makkelijk een std::string aan een Borland String toekennen? :?

Waar het me om te doen is, is het inlezen van een aantal tekst regels uit een .ini bestandje en daar dan wat mee doen. En ja, ik weet wel dat er in C++ Builder een TIniFile class zit maar ik wou de class die ik nu maak enigzins portable houden..

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider


  • Zoijar
  • Registratie: September 2001
  • Niet online

Zoijar

Because he doesn't row...

std::string is de standaard C++ string. Als je alles portable wilt houden, dan moet je die gebruiken. Die andere twee ken ik eerlijk gezegd niet, nooit mee gewerkt, maar dat zijn waarschijnlijk eigen implementaties, ongeveer gelijk.

  • Sjaaky
  • Registratie: Oktober 2000
  • Laatst online: 22-04 07:04
AnsiString is van BCB en compatible met de achterliggende Delphi code. Waar String vandaan komt weet ik niet. Maar ik vraag me idd ook wel eens af hoe je het beste met al die strings moet omgaan. In principe is std::string dé standaard string, dus je interne datastructuren wil je daarin uitvoeren, maar dan moet je alles dat naar de gui gaat omzetten naar een AnsiString. Wat natuurlijk geen probleem is, maar makkelijk/snel/geheugenbesparend is anders.
Dit probleem geldt voor meer zaken dan alleen strings. Als je bijvoorbeeld kijkt naar libraries zoals Boost, WxWidgets en Ace. Die leveren allemaal hun eigen portable threads wrappers. Ik zou niet weten of je een Boost thread via een makkelijke conversie aan WxWidgets of aan Ace aan kan bieden.
Wat dat betreft zijn de nieuwe programmeer 'omgevingen' zoals .net en java een stuk fijner omdat er standaard een stuk meer bij zit.

  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
String is de naam van ongeveer elke string klasse. Hebben we weinig aan, dus.

Waarom kun je een std::string niet uppercasen? Omdat dat locale-specific is - in het duits zijn er andere regels (umlauts en dat soort dingen). Je hebt dus een std::locale object nodig.

Trimmen is geen member functie, maar daar gebruik je de STL voor. Het voordeel van deze free functions is dat dezelfde std::remove* functies ook gebruikt kunnen worden om negative waardes uit een vector te gooien, of rode kleuren uit een list.

Doordenkertje voor de mensen die denken dat het voordeel van .NET een standaard thread library is: C++.NET gebruikt die thread library, of natuurlijk de boost thread library, of ACE, of... Kortom, het voordeel van standaarden is dat je zoveel keus hebt :)

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 18-05 22:02

Creepy

Tactical Espionage Splatterer

MSalters schreef op dinsdag 30 november 2004 @ 23:44:
String is de naam van ongeveer elke string klasse. Hebben we weinig aan, dus.
Dat valt mee. In Borland C++ builder is String de VCL String. De VCL string is afhankelijk van de compiler opties een ShortString (old style pascal max 255 tekens) of een AnsiString (ook weer VCL). Maar die zou ik niet gebruiken als je je code portable wilt houden.

[ Voor 19% gewijzigd door Creepy op 01-12-2004 08:52 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Sjaaky schreef op dinsdag 30 november 2004 @ 22:40:
[...]
In principe is std::string dé standaard string, dus je interne datastructuren wil je daarin uitvoeren, maar dan moet je alles dat naar de gui gaat omzetten naar een AnsiString. Wat natuurlijk geen probleem is, maar makkelijk/snel/geheugenbesparend is anders.

[...]
Als je toch met de GUI classes van BCB gaat werken is je code niet meer portable, oftewel dan kan je gewoon (beter) de AnsiString gaan gebruiken. Bespaart je een hoop tijd.

  • BdR
  • Registratie: Juni 2001
  • Laatst online: 03-09-2025

BdR

TV is gooder then books

Topicstarter
Verwijderd schreef op woensdag 01 december 2004 @ 09:12:
Als je toch met de GUI classes van BCB gaat werken is je code niet meer portable, oftewel dan kan je gewoon (beter) de AnsiString gaan gebruiken. Bespaart je een hoop tijd.
Ik probeer de GUI en het daadwerkelijke programma (een spelletje, natuurlijk :P) gescheiden te houden. Ik neem aan dat het dan relatief makkelijker te porten is. Op een Linux of MacOS C++ dev. environment hoef je dan alleen de GUI te definieren en events e.d. te koppelen aan de methods van het "daadwerkelijke programma".

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider


  • BdR
  • Registratie: Juni 2001
  • Laatst online: 03-09-2025

BdR

TV is gooder then books

Topicstarter
--> nog ff een nieuw vraagje

Ik loop nu nog tegen het volgende aan, hoe werken string vergelijkingen in C++?

code:
1
2
3
4
5
6
7
8
9
10
  Line = "XPOS=123"
  iPos = Line.find("=");

  // nu wordt Key="XPOS" Value="123"
  Key = Line.substr(0, iPos);
  Value = Line.substr(iPos+1, Line.length()-iPos);

  if (Key.compare("XPOS") == true) {
    xPos = atoi(Value.c_str());
  }

Als ik met de BCB debugger de waarde van Key bekijk als ie bij regel 8 is, dan staat er "XPOS" in. Maar toch komt ie niet bij regel 9, de vergelijking levert dus blijkbaar false op. Die strings vergelijking is toch goed, op deze manier?

edit:
ik heb het al, ik had de string regel ingelezen vanuit een file
code:
1
getline(srcFile, Line);

en dan zitten er nog een onzichtbare "\n" (end-of-line) characters aan het eind van de string. Die moet je eerst weghalen en dan werkt het wel goed. :)
Ook de gewone vergelijking "if (Key == "XPOS")" werkt dan goed.

[ Voor 68% gewijzigd door BdR op 21-12-2004 23:30 ]

mijn web games -> Impossible Snake 2 :: Impossible Snake :: Snake Slider


  • _Squatt_
  • Registratie: Oktober 2000
  • Niet online
compare() doet niet wat jij denkt wat het doet. Of geeft in ieder geval niet de returnwaarde die jij wilt:
C++:
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <string>

int main()
{
  std::string s("b");

  std::cout << s.compare("a") << '\n'
            << s.compare("b") << '\n'
            << s.compare("c") << '\n';
}


Dit programma geeft als output:
code:
1
2
3
4
$ ./a.out
1
0
-1


std::string's zijn met == te vergelijken. Wellicht ten overvloede: '=' doet een assignment, geen vergelijking!
edit:
ok, je bent er al uit :)

[ Voor 20% gewijzigd door _Squatt_ op 21-12-2004 23:35 ]

"He took a duck in the face at two hundred and fifty knots."


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Misschien dus nog even benadrukken, want TS is nog niet heel erg ervaren. compare( ) geeft een int terug, en vanwege de standaard int->bool conversie kun je die dus ooK in een if ( [i]bool-conditie[i] ) statement gebruiken. Alleen is de conversie 0->false, anders ->true. compare( ) geeft 0->false terug als de strings gelijk zijn. Dus (bool) string("X").compare("X") is false!

[ Voor 14% gewijzigd door MSalters op 22-12-2004 03:17 . Reden: laat... ]

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein

Pagina: 1