Toon posts:

[C++.NET] door string zoeken*

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik ben bezig met een programmatje te maken dat strings bewerkt, maar bij het inlezen van de benodigde gegevens uit deze string gaat iets fout.
De string 'regel', bevat de waarde: "Als Beginwaarde=IF2002<120,Then eindwaarde=IF2003<136,eind"
Ik wil de waarde "120" in een domainUpDown1 krijgen.
Hiervoor heb ik besloten om door de string heen te lopen tot aan de EERSTE "<", vanaf hier door te gaan naar de EERSTE ",".
Het stukje string tussen de "<" en de "," wordt naar de string 'test' gestuurd met een for loop.
De string 'test' wordt naar de domainUpDown gestuurd.

Het probleem zit um erin dat er niet wordt gekeken naar de EERSTE "<", maar naar de tweede.

Het programma wordt gemaakt in C++.NET van MS Visual Studio.NET.


Hieronder staat de programma code:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
             int plaatsBegin='0', plaatsEind='0', plaats='0';
             char kar='0';
             std::string beginMin, beginMax,test;
             std::string regel = "Als Beginwaarde=IF2002<120,Then eindwaarde=IF2003<136,eind";
             textBox1->Text = new System::String(regel.c_str());
             while (kar != '<') 
             {
                 plaatsBegin++;
                 kar = regel[plaatsBegin];
             }
             plaatsEind = plaatsBegin;
             plaatsBegin++;
             while (kar != ',')
             {
                 plaatsEind++;
                 kar = regel[plaatsEind];
             }
             for (int i=0;i<plaatsEind-plaatsBegin; i++)
             {
                 test[i]=regel[plaatsBegin+i];
             }
             domainUpDown1->Text = new System::String(test.c_str());
             }



hoe kan het zijn dat hij de 2de vind ipv de eerste, maar vooral hoe los ik het op

[ Voor 36% gewijzigd door Verwijderd op 22-03-2004 13:22 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 14:08
Euh, waarom maak je geen gebruik van de reeds bestaande member-functies van de System::String class?

https://fgheysels.github.io/


Verwijderd

Topicstarter
thnx voor aanpassen van topic titel

Ik krijg de System::String niet gedeclarreerd, dus heb ik maar een std::string genomen.
Als ik de help raadpleeg over de System::String, dan staat daar over de syntax:
newString = new String (["stringliteral"])
newString is required. The variable name to witch the String is assigned
stringliteral is any group op unicode charakters.

maar als ik dit gebruik, dan krijg ik de error melding:
c:\C++test\Lijnbewaking_test\Form1.h(171) : error C2065: 'newString' : undeclared identifier

en over welke standaard functies heb je het eigelijk?
werken deze ook bij std::strings ?

[ Voor 36% gewijzigd door Verwijderd op 22-03-2004 14:05 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 14:08
Nee, en ik vraag me af waarom je std::strings gebruikt ipv de String class.

Kijk eens in de help naar de String class, en naar de member functies van die class.

https://fgheysels.github.io/


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Verwijderd schreef op 22 maart 2004 @ 13:18:
Als ik de help raadpleeg over de System::String, dan staat daar over de syntax:
newString = new String (["stringliteral"])
newString is required. The variable name to witch the String is assigned
stringliteral is any group op unicode charakters.
Dat is natuurlijk logisch, dit werkt ook niet:
C++:
1
2
3
4
int main ()
{
    i = 4;
}


Dit natuurlijk wel:
C++:
1
2
3
4
int main ()
{
    int i = 4;
}


Je moet dus een System::String variabele definieren. Overigens kun je in C++ het beste een S voor je string literal zetten, dan wordt er niet tijdens runtime elke keer een nieuwe String gealloceerd, en dat komt je performance ten goede

C++:
1
2
3
4
int main ()
{
    System::String * str = S"hallo daar";
}

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
door die System::String kan ik m'n code helemaal niet meer uitvoeren, aangezien deze gebouwd is op een std::string

Onderstaande code is bijv. onmogelijk
code:
1
kar = regel[plaatsBegin];


uit de regel
code:
1
System::String * str = S"hallo daar";


haal ik dat str een pointer is naar de string.
hoe kan ik de string doorlopen en vergelijken met behulp van deze pointer?

[ Voor 38% gewijzigd door Verwijderd op 22-03-2004 14:57 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Daar heb je methoden voor in System::String.
System::String documentatie in MSDN, en met name de String::Chars property

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Thnx, ik heb um nou werkend als een System::String.
maar nog steeds krijg ik de waarde achter de TWEEDE ""<" terug (en dat is 136 ) ipv de waarde achter de EERSTE "<" (dat is 120).

dus nou maakt ie dezelfde fout, maar dan met een System::String

de code voor het zoeken naar de EERSTE "<" is nou als volgd:
code:
1
2
3
4
5
6
7
8
 int plaatsBegin='0';
 char kar='0';
 System::String * regel = S"Als Beginwaarde=IF2002<120,Then eindwaarde=IF2003<136,eind";
 while (kar != '<') 
 {
     plaatsBegin++;
     kar = regel->get_Chars(plaatsBegin);
 }


Bij compileren krijg ik wel de foutcode C4244 wat inhoud dat er bij conversie van het ene type naar het andere mogelijk data verloren kan gaan.

[ Voor 22% gewijzigd door Verwijderd op 23-03-2004 08:38 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 14:08
Je gebruikt nog steeds de member functies van string niet.

https://fgheysels.github.io/


Verwijderd

Topicstarter
huh???
nou volg ik je niet meer...

Ik heb in de search van MS Visual Studio gezoch op "String chars". Op Rank 13 staat "String members", daaronder staan alle member functies van String, toch??
Als ik dit open zie ik onder het kopje "Public Properties" Chars staan.

Als ik daarop klik dan zie ik hoe dat ik get_Chars moet gebruiken.
WAT doe ik dan nou nog fout?
en hoe moet het dan wel :S

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:08
Waarom gebruik je bv niet de IndexOf member functie van string, ipv door die string te loopen op zoek naar '<' ?

https://fgheysels.github.io/


Verwijderd

Topicstarter
dus dan zou ik er het volgende van moeten maken volgens jou:

code:
1
2
3
4
5
6
 int plaatsBegin='0', plaatsEind='0', plaats='0', kar='0', kar1='-1';
 System::String * regel = S"Als Beginwaarde=IF2002<120,Then eindwaarde=IF2003<136,eind";
 while (kar != '-1')    
 {
 kar = regel->IndexOf(S"<",plaatsBegin++);
 }


ik krijg hier in elk geval geen fouten meer, maar het copieren van de gevonde string naar een andere (om daarna in de dialogUpDown te plaatsen) is me nog niet gelukt met System::String

[ Voor 32% gewijzigd door Verwijderd op 23-03-2004 09:25 ]


  • whoami
  • Registratie: December 2000
  • Laatst online: 14:08
Kijk eens wat die IndexOf returned, en hoe je het gebruikt.... Waarom zet je dat in een while ?

https://fgheysels.github.io/


Verwijderd

Topicstarter
IndexOf returned een -1 als het karekter niet overeen komt, en de plaats van het gevonden karakter als deze wel gevonden is.

dan moet je um dus met behulp van een loop (while in dit geval) door de string laten lopen.

Want bij het eerste karakter geeft ie een -1, bij ut 2de een -1 enz. enz.
tot ie bij de "<" komt en dan geeft ie de waarde waar dat de "<" staat.
In het voorbeeld van MSVS staat deze ook in een loop, en wordt er ook een sting mee doorlopen

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:08
Verwijderd schreef op 23 maart 2004 @ 09:45:
IndexOf returned een -1 als het karekter niet overeen komt, en de plaats van het gevonden karakter als deze wel gevonden is.

dan moet je um dus met behulp van een loop (while in dit geval) door de string laten lopen.
Heb je dit al eens geprobeerd ?
code:
1
int index = string.IndexOf ("<");

https://fgheysels.github.io/


Verwijderd

Topicstarter
heey, dat werkt perfect...
haha, ik zat te moeilijk te doen.

De totale code is nou:
code:
1
2
3
4
5
6
7
 int lengte='0', kar='0', kar1='-1';
 System::String * regel = S"Als Beginwaarde=IF2002<120,Then eindwaarde=IF2003<136,eind";
 textBox1->Text = regel;
 kar = regel->IndexOf("<");
 kar1 = regel->IndexOf(",");
 lengte = kar1-kar-1;
 domainUpDown1->SelectedItem = regel->Substring(kar+1, lengte);


er zit nou alleen nog 1 probleem...
de regel
code:
1
 kar1 = regel->IndexOf(",");

zoekt naar de eerste komma, terwijl ik de eerste komma NA de "<" moet hebben.

[ Voor 115% gewijzigd door Verwijderd op 23-03-2004 11:38 ]


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 16:31

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik zou trouwens van die "<" een L'<' maken. Je zoekt natuurlijk naar een enkele character, geen string, vandaar de enkele quotes, en die L geeft aan dat ie unicode moet gebruiken (oftewel een wchar_t, wat het native char datatype is in .net). Als je dan toch met strings werkt zou ik een S ervoor zetten, dan maakt de compiler er automatisch een System::String van

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Verwijderd

Topicstarter
Heel erg bedankt, maar hoe zoek je nou ut eerste karakter vanaf een bepaalde plek?

bijv. de eerste "," na de "<" ??

  • whoami
  • Registratie: December 2000
  • Laatst online: 14:08
Kijk nog eens naar de IndexOf method, en bekijk de overload list eens..... :z

Dit is echt wel RTFM hoor.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Thnx, keb het gevonden.

code:
1
2
int index1 = string->IndexOf (L'<');
int index2 = string->IndexOf (L',',index1);


tis wel een RTFM, maar de manuel is opgebouwd voor profs, voor beginnelingen issut fucking lastig om fatsoenlijk wat te vinden...

maar toch bedankt

[ Voor 8% gewijzigd door Verwijderd op 24-03-2004 10:39 ]

Pagina: 1