Toon posts:

[c++] Grootte van string uit INT halen

Pagina: 1
Acties:
  • 75 views sinds 30-01-2008

Verwijderd

Topicstarter
Ik weet het, het is C++ voor uber-dummy's, maar toch :) Ik heb string groet[]... de lengte bepaal ik door strlen(groet) te doen. Een cout << groet geeft ook netjes de lengte van de string.

Nu wil ik een tweede string declareren die 2x de grootte van 'groet' is. Dus ik doe het volgende:
code:
1
2
int aantal_tekens = 2 * strlen(groet);
char groet_verdubbeld[aantal_tekens];


De compiler geeft de volgende fouten:
error C2057: expected constant expression
error C2466: cannot allocate an array of constant size 0
error C2133: 'groet_verdubbeld' : unknown size
Wat doe ik verkeerd? Of denk ik te simpel ofzo?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 19-05 21:24

NMe

Quia Ego Sic Dico.

Je kan in een declaratie geen variabelen gebruiken volgens mij. Je zult die eerste regel dus op moeten breken in twee regels geloof ik, als collega C++ dummy. :P
* NMe moet geen domme dingen zeggen... :X

Op de oude C-manier moet je trouwens een dynamisch array eerst als pointer declareren, en daarna geheugen alloceren (met malloc() of calloc() ) zodra je de volledige grootte van het array weet.

[ Voor 44% gewijzigd door NMe op 29-09-2004 18:04 ]

'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.


  • mmedia
  • Registratie: Januari 2002
  • Laatst online: 17-12-2021
Je dient de array dynamisch aan te maken via de new operand.
C++:
1
2
int aantal_tekens = 2 * strlen(groet);
char *groet_verdubbeld = new char[aantal_tekens];
NMe84 schreef op 29 september 2004 @ 17:54:
Je kan in een declaratie geen variabelen gebruiken volgens mij. Je zult die eerste regel dus op moeten breken in twee regels geloof ik, als collega C++ dummy. :P
* mmedia moet geen domme dingen zeggen... :X

Op de oude C-manier moet je trouwens een dynamisch array eerst als pointer declareren, en daarna geheugen alloceren (met malloc() of calloc() ) zodra je de volledige grootte van het array weet.
Ja idd, en om het netjes te doen ook nog ff de pointer type casten.

Voorbeeldje:
C:
1
2
int *iPtr;
iPtr = (int *) malloc(5 * sizeof(int));

[ Voor 112% gewijzigd door mmedia op 29-09-2004 18:11 ]


  • mmedia
  • Registratie: Januari 2002
  • Laatst online: 17-12-2021
* mmedia zette per ongeluk 2 berichten onder elkaar |:(

[ Voor 91% gewijzigd door mmedia op 29-09-2004 18:11 ]


Verwijderd

En aangezien C-strings worden afgesloten door een extra nul-karakter, is het dus raadzaam om:

C++:
1
2
std::size_t aantal_tekens = 2 * std::strlen(groet) + 1;
char *groet_verdubbeld = new char[aantal_tekens];


te doen, maar dit is puur C (behalve new dan), de C++ oplossing is om gewoon met std::string te werken:

C++:
1
2
3
4
5
const std::string groet("hallo");
const std::string groet_verdubbeld(groet + groet);
std::cout << groet_verdubbeld
    << " lengte: " << groet_verdubbeld.length()
    << std::endl;

[ Voor 27% gewijzigd door Verwijderd op 29-09-2004 18:58 ]


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
mietjje heeft de nette oplossing, maar in C++ hoef je je meestal niet meer druk te maken over de grootte van een std::string. Zolang je de karakters toevoegt met += groeit de string mee.

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


  • MBV
  • Registratie: Februari 2002
  • Laatst online: 22-05 21:28

MBV

In C++ heb je, in tegenstelling tot C, een aantal standaardstructuren waarbij je je geen zorgen hoeft te maken over elementaire zaken als copieëren, dynamisch aanmaken, etc. Ik zou een cursusje volgen als ik jouw was, want je kan er veel makkelijker mee werken dan met C.

Verwijderd

Topicstarter
Oke, ik kan de tweede variabele nu declareren met de waarde: dubbel(groet). Alleen het vullen wil nog niet echt lukken. Ik wil namelijk dat de string van 'groet' verdubbeld wordt in de tweede variable.

Stel, groet = "abcde", dan moet groet_verdubbeld worden: "aabbccddee".
Ik heb het volgende geprobeerd:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void verdubbel(char groet[])
{
    // Verdubbel ieder karakter.
    int aantal_tekens = 2 * strlen(groet);
    char groet_verdubbeld;

    //char *groet_verdubbeld = new char[aantal_tekens];
    
    for(int t=0; t<=strlen(groet); t++)
    {
        groet_verdubbeld += groet[t];
    }
    cout << "\n\n\n";
    cout << groet;
    cout << "\n\n\n";
    cout << groet_verdubbeld << "\n\n\n";
}
Probleem is dat groet_verdubbeld nu allemaal rare tekens bevat, en niet het 'dubbele' van groet.

  • MBV
  • Registratie: Februari 2002
  • Laatst online: 22-05 21:28

MBV

duh, nogal logisch. Een char is 1 teken. Zoek eens een mooie C++ tutorial, daar zijn wij niet voor op GoT IM(H)O. Hier kan je terecht voor alle problemen nadat je serieus op het internet hebt gezocht. Trouwens, je hebt niet eens gedaan wat mietje heeft gezegd.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Euh ja, dit gaat nergens meer over. Lees de allereerste alinea van de FAQ nog eens door; GoT is een forum voor en door gevorderde computergebruikers. Dat betekent niet dat beginners hier niet welkom zijn, maar we streven wel naar een bepaald niveau. Jij bent blijkbaar nog niet echt helemaal bekend met C++ en de manier waarop strings en char arrays werken, terwijl dat toch een van de basis-elementen is. Ik raad je dus aan een goed boek of wat tutorials op te zoeken om je er wat meer bekend mee te laten raken, want (nofi) momenteel ben je maar een beetje aan het prutsen, en zo lang je de basis niet snapt kunnen wij je eigenlijk ook niet helpen. Veel succes :)

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.

Pagina: 1

Dit topic is gesloten.