[C++] String opdelen

Pagina: 1
Acties:
  • 593 views

Acties:
  • 0 Henk 'm!

  • Droned
  • Registratie: November 2007
  • Laatst online: 21-11-2023
Beste tweakers,

Ik heb een probleem bij mij c++ programma.

Via een functie krijg ik een string binnen van het type char *, nu zou ik deze willen kunnen opspliten.

Bv de string is "abcdefghij" ik zou nu willen weergeven op mijn scherm bv

de volgende karakters zijn toegelaten :

" a " " b " " c " ...

Groetjes,

Dries

Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Ben je bekend met het feit dat je een char* kunt benaderen als een array?

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 14:34

remco_k

een cassettebandje was genoeg

Samen met de bovengenoemde array kijk je even naar een for loopje, en je bent klaar.

Alles kan stuk.


Acties:
  • 0 Henk 'm!

  • Oguz286
  • Registratie: Juni 2002
  • Laatst online: 23-02 10:10
Ben je ook bekend met het feit dat je eigenlijk zelf moeite moet doen om de oplossing te vinden en alles wat je hebt geprobeerd ook in je topicstart te plaatsen? GoT is geen plaats om zomaar je vragen neer te dumpen he? ;)

Anyways, een char* is een pointer naar een char die je kan aanspreken als een array zoals curry al aangaf.
Met strlen kan je de lengte van de char-array opvragen en door de array heen itereren. Dit had je makkelijk met google kunnen vinden.

EDIT: dat van curry hieronder is nog mooier :P

[ Voor 15% gewijzigd door Oguz286 op 26-11-2008 13:49 ]


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

remco_k schreef op woensdag 26 november 2008 @ 13:45:
Samen met de bovengenoemde array kijk je even naar een for loopje, en je bent klaar.
Een for-loop is niet zo handig over zero terminated strings :)
C++:
1
2
3
4
5
while(*myString)
{
  doYourThing();
  myString++;
}

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 14:34

remco_k

een cassettebandje was genoeg

curry684 schreef op woensdag 26 november 2008 @ 13:47:
[...]

Een for-loop is niet zo handig over zero terminated strings :)
C++:
1
2
3
4
5
while(*myString)
{
  doYourThing();
  myString++;
}
Waar staat dat die string zero terminated is?
Het voorbeeld wat je nu geeft gaat zonder zero termination onherroepelijk de fout in.
En al zou de string zero terminated zijn, dan kan het alsnog prima met een for. Wellicht zelfs nog veiliger om als extra'tje de char * lengte meenemen in de voorwaarde.
Het is gewoon een keuze.

[ Voor 14% gewijzigd door remco_k op 26-11-2008 13:56 ]

Alles kan stuk.


Acties:
  • 0 Henk 'm!

  • Droned
  • Registratie: November 2007
  • Laatst online: 21-11-2023
curry684 schreef op woensdag 26 november 2008 @ 13:42:
Ben je bekend met het feit dat je een char* kunt benaderen als een array?
Ah ja, en dan een lus met de lengte van je string?

Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 14:34

remco_k

een cassettebandje was genoeg

Droned schreef op woensdag 26 november 2008 @ 13:52:
[...]


Ah ja, en dan een lus met de lengte van je string?
Dat is wel het veiligste ja.
De while methode van curry684 werkt ook, maar dan moet je _zeker_ weten dat je de string eindigt met een null byte.

Alles kan stuk.


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

remco_k schreef op woensdag 26 november 2008 @ 13:52:
[...]

Waar staat dat die string zero terminated is?
Hij krijgt de string binnen als char*, niet als char* en int of std::string of iets anders. Als je een variable length string binnenkrijgt als char* hoop ik voor je dat ie zero terminated is want anders heb je best een probleem om te bepalen hoe lang ie is ;)
Het voorbeeld wat je nu geeft gaat zonder zero termination onherroepelijk de fout in.
Ik werk enkel op de gegeven input parameters, zoals de case omschreven is is het een zero-terminated apparaat.
En al zou de string zero terminated zijn, dan kan het alsnog prima met een for.
Net als met jouw while. Het is gewoon een keuze.
C++:
1
2
for(;*myString; myString++)
  doYourThing();

True, wat jij wil ;) Meestal vinden mensen de while-variant leesbaarder voor dit soort situaties.
Droned schreef op woensdag 26 november 2008 @ 13:52:
[...]

Ah ja, en dan een lus met de lengte van je string?
Als je die met strlen wil gaan opvragen zijn er performantere en slimmere methodes zoals hier dus omschreven ;)

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • Droned
  • Registratie: November 2007
  • Laatst online: 21-11-2023
Ok bedankt, het is me gelukt.

Nu werkt toupper niet, ik heb overal opgezocht wat ik moet toevoegen en het was #include <ctype.h> .

enkel als ik een integer meegeef dan werkt het wel.

Dus als volgt toupper(21). maar toupper("a") werkt niet.

Iemand hiervoor een verklaring?

Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Ik zou even een beginnersboek C/C++ gaan lezen zodat je het verschil tussen enkele en dubbele quotes weet.

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • Droned
  • Registratie: November 2007
  • Laatst online: 21-11-2023
Ja mijn fout, komt van mijn php, nu geeft deze een ascii waarde terug, waarom doet hij niet direct A in plaats van 64 weer te geven?

Acties:
  • 0 Henk 'm!

Verwijderd

Droned schreef op woensdag 26 november 2008 @ 14:15:
Ja mijn fout, komt van mijn php, nu geeft deze een ascii waarde terug, waarom doet hij niet direct A in plaats van 64 weer te geven?
Omdat jij niet begrijpt wat een char en een string eigenlijk zijn.
Misschien helpt het als je het ziet als een getal en een rijtje getallen, die vertaald mogen worden naar bepaalde tekens uit een character set.

Acties:
  • 0 Henk 'm!

  • remco_k
  • Registratie: April 2002
  • Laatst online: 14:34

remco_k

een cassettebandje was genoeg

Alles kan stuk.


Acties:
  • 0 Henk 'm!

  • Droned
  • Registratie: November 2007
  • Laatst online: 21-11-2023
Verwijderd schreef op woensdag 26 november 2008 @ 14:21:
[...]

Omdat jij niet begrijpt wat een char en een string eigenlijk zijn.
Misschien helpt het als je het ziet als een getal en een rijtje getallen, die vertaald mogen worden naar bepaalde tekens uit een character set.
Maar cout << toetsen[teller]; geeft bij teller = 1 ====> a
en cout << toupper(toetsen[teller]); geeft bij teller = 1 ===> 64

Dus het zijn alletwee charachters, en wat moet ik hier begrijpen van char en string?

Acties:
  • 0 Henk 'm!

Verwijderd

De functie toupper returnt int en niet char.

Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Dat ostream::operator << overloaded is om diverse types data op de correcte manier te renderen en deze 'char' en 'int' als andere input types ziet en je dus in dit geval een cast zal moeten doen omdat toupper om een aantal goede redenen een int retourneert ipv een char.

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

Link dan wel even de goede pagina ipv de complexe localized template variant :X

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • Droned
  • Registratie: November 2007
  • Laatst online: 21-11-2023
Beste,

Ik denk dat ik iets niet goed snap, volgende code werkt wel:

C++:
1
2
3
4
5
6
7
8
9
10
char str[lengte*2];
                     strcpy(str,toetsen);
                     
                        if(isupper(toetsen[teller]))
                        {
                           char kleineletter = tolower(toetsen[teller]);
                           cout << toetsen[teller] << " ";
                           cout << kleineletter << " ";
                           cout << strcat(str,"dries");                           
                        }


en deze niet

C++:
1
2
3
4
5
6
7
8
9
10
char str[lengte*2];
                     strcpy(str,toetsen);
                     
                        if(isupper(toetsen[teller]))
                        {
                           char kleineletter = tolower(toetsen[teller]);
                           cout << toetsen[teller] << " ";
                           cout << kleineletter << " ";
                           cout << strcat(str,kleineletter);                           
                        }

Acties:
  • 0 Henk 'm!

  • curry684
  • Registratie: Juni 2000
  • Laatst online: 06-09 00:37

curry684

left part of the evil twins

1. Ga alsnog eens dat beginnersboek lezen gaarne.
2. Geef compilererrors als je ze krijgt, lees ze ook zelf
3. Overweeg een hogere taal als C#/Java te pakken, of een framework in C++ dat je van dit soort low-level geneuzel af helpt.

Professionele website nodig?


Acties:
  • 0 Henk 'm!

  • Droned
  • Registratie: November 2007
  • Laatst online: 21-11-2023
curry684 schreef op woensdag 26 november 2008 @ 15:26:
1. Ga alsnog eens dat beginnersboek lezen gaarne.
2. Geef compilererrors als je ze krijgt, lees ze ook zelf
3. Overweeg een hogere taal als C#/Java te pakken, of een framework in C++ dat je van dit soort low-level geneuzel af helpt.
- Eerste error : invalid conversion from `char' to `const char*'
- Tweede error : initializing argument 2 of `char* strcat(char*, const char*)'

Nu moeten we dit voor school in C++ schrijven, dus kan niet overstappen op een hogere taal...

Acties:
  • 0 Henk 'm!

  • SH4D3H
  • Registratie: Juni 2004
  • Laatst online: 27-02 23:46
Droned schreef op woensdag 26 november 2008 @ 15:31:
[...]
Nu moeten we dit voor school in C++ schrijven, dus kan niet overstappen op een hogere taal...
Misschien een domme vraag van mij dan maareh: leer je geen C++ daar dan?
Of verwachten ze op jouw school ook dat je opstellen in het Japans schrijft zonder je lessen te geven?

Acties:
  • 0 Henk 'm!

  • Droned
  • Registratie: November 2007
  • Laatst online: 21-11-2023
Inderdaad, we krijgen les. Maar we hebben altijd C gehad, en nu krijgen we C++. We hebben de eerste les de basis gezien en moeten nu zelf wat uitzoeken.

Daarom hier mijn vragen. Ik weet dat het vrij amateuristisch overkomt deze vragen, maar dit is de enige manier hoe ik het begin te snappen...

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

Dat het amateuristisch is maakt niet zoveel uit maar je lijkt eerst te vragen voordat je zelf je probleem probeert op te lossen of eerst eens even rustig na te denken. Als je dit voor school moet doen dan heb je zeker een boek of reader waar meer informatie in staat en ook nog een docent die er voor je is. Dus duik nu eens je papierwerk in en raadpleeg je docent als je er dan nog niet uitkomt. De foutmeldingen die je nu krijgt moet je met een beetje basiskennis van C echt wil op kunnen lossen. Met C++ basiskennis heb je de C zaken die je nu gebruikt niet nodig.

We verwachten hier dat als je een vraag stelt dat je zelf ook opzoek bent geweest naar een oplossing en dat je dat ook laat zien in je vraag. Nu dump je hier een paar posts lang een foutmelding of een "dit doet het niet, help" achtige melding en dat is hier echt niet de bedoeling.

Ga er dus gewoon zelf echt mee aan de slag en raadpleg je documentatie en/of je docent. Kom je er dan echt niet uit dan kan je een nieuw topic openen maar lees daarvoor welk eerst PRG Beleid enHet algemeen beleid #topicplaatsen door zodat je weet wat wij van jou verwachten.

[ Voor 18% gewijzigd door Creepy op 26-11-2008 15:46 ]

"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


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Droned schreef op woensdag 26 november 2008 @ 15:37:
Inderdaad, we krijgen les. Maar we hebben altijd C gehad, en nu krijgen we C++. We hebben de eerste les de basis gezien en moeten nu zelf wat uitzoeken.
Als ze je op school niet het verschil uitgelegd hebben tussen een char en een char pointer (wat in C gebruikt wordt voor strings), dan zet ik mijn vraagtekens bij je leraar. :)

edit:

/laat. :+

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1

Dit topic is gesloten.