[C++] string naar chararray (howto?)

Pagina: 1
Acties:

  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
ik ben weer een ochtentje aan het proberen een string om te zetten in char[]. Kan iemand me aub vertellen wat ik verkeert doe?

string bestand="./welcome.so";
int j=bestand.length();
char bestandchar[j]=bestand.data;

of...

int j=bestand.length();
char bestandchar[j];

for (int i=0; i<j; i++)
{
bestandchar[i]=bestand.getchar(i);
}

Steun Elkaar, Kopieer Nederlands Waar!


  • KnoppenSpook
  • Registratie: Augustus 2000
  • Laatst online: 04-09-2023
Op donderdag 24 januari 2002 10:08 schreef Skinkie het volgende:
ik ben weer een ochtentje aan het proberen een string om te zetten in char[]. Kan iemand me aub vertellen wat ik verkeert doe?

string bestand="./welcome.so";
int j=bestand.length();
char bestandchar[j]=bestand.data;

of...

int j=bestand.length();
char bestandchar[j];

for (int i=0; i<j; i++)
{
bestandchar[i]=bestand.getchar(i);
}
char bestandchar[j]; // <-- Dit mag niet! daar moet een constante staan, 15 ofzo.
Nou kan je daar natuurlijk iets van 255 voor nemen omdat string nooit langer wordt
ja kan ook _MAX_PATH (Maximum length of full path ) nemen.

of je moet de char aray met malloc alloceren. (dan maakt ie dat stukje geheugen vrij voor jouw char array en dat kan on-the-fly)

bestandchar = (char*)malloc(sizeof(char)*j);

en dan aan het eind free(bestandchar);

/me weet geen leuke quote voor in zijn signature


  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
met malloc krijg ik een error dat ik um niet gedeclared heb

moet er nog een char * voor?

Steun Elkaar, Kopieer Nederlands Waar!


  • KnoppenSpook
  • Registratie: Augustus 2000
  • Laatst online: 04-09-2023
ja klopt
eerst
char* bestandchar;

/me weet geen leuke quote voor in zijn signature


  • Bananeman
  • Registratie: Juli 2000
  • Niet online
Op donderdag 24 januari 2002 10:14 schreef KnoppenSpook het volgende:

[..]
of je moet de char aray met malloc alloceren. (dan maakt ie dat stukje geheugen vrij voor jouw char array en dat kan on-the-fly)

bestandchar = (char*)malloc(sizeof(char)*j);

en dan aan het eind free(bestandchar);
Het is wel C++ waar we het over hebben, dus:

char* bestandchar = new char[j + 1];

De +1 is om een trailing zero te kunnen hebben om het einde van de string aan te geven. Om het geheugen vrij te geven doe je:

delete[] bestandchar;

Lees anders eens een boekje over C++, dit is echt basiskennis. Verder wordt het een ander verhaal als het een unicode-string is, dan moet alles keer twee enzo.

Motor-forum.nl


  • KnoppenSpook
  • Registratie: Augustus 2000
  • Laatst online: 04-09-2023
de bananen hebben gelijk :)

/me weet geen leuke quote voor in zijn signature


  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
ik heb nu:

char *bestandchar = (char *)malloc(sizeof(char)*j);
*bestandchar = *bestand.data();

edit:

echter... er komt alleen het eerste teken uit bestandchar, als ik cout << bestand.data doe krijg ik wel output.

Steun Elkaar, Kopieer Nederlands Waar!


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:47
Zorg eerst dat je concepten als variabelen, pointers en geheugenallocatie begrijpt, voordat je weer een poging doet tot programmeren in C/C++.

Sowieso moet je (j+1) bytes alloceren, zoals Bananeman al zei, en daarbij wil je niet alleen het eerste karakter kopiëren, maar de hele string. Zo dus:
code:
1
memcpy(bestandchar,bestand.data(),j+1);

Of:
code:
1
strcpy(bestandchar,bestand.data());

Overigens is hier ook gewoon een standaard functie voor, waarbij automagisch voldoende geheugen wordt gealloceerd:
code:
1
2
3
4
5
6
   string a="Dit is een test";
   char *b=strdup(a.data());

   ...

   free(b);

  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
Het enige wat ik krijg als ik niet bij die 2 sterretjes neer zet is een compiler error:

cannot convert 'const char*' to 'char' in assignment.

en ja ik moet ook een boek lezen... en ik ben van morgen ook druk op google aan het zoeken geweest maar staan gewoon nergens werkende voorbeelden hoe je string naar chararray moet doen.

dit zou moeten werken volgens:
http://www.bgsu.edu/departments/compsci/docs/string.html

string s = "abc def abc";
char ch[] = "aba daba do";
char *cp = ch;

cp = s.c_str();

ik krijg echter major errors.

Steun Elkaar, Kopieer Nederlands Waar!


  • Skinkie
  • Registratie: Juni 2001
  • Laatst online: 09-06-2020

Skinkie

Op naar de 500

Topicstarter
Thanx Soultaker, het werkt :)
Heb je ook nog een boeken tip? :+
code:
1
2
3
4
5
6
7
8
9
int main(int argc, char **argv)
{
 string bestand="./welcome.so";
 chat *bestandchar = strdup(bestand.data());
// cout << bestandchar;
 shared(bestandchar);
 free(bestandchar);
 return=0;
}

Steun Elkaar, Kopieer Nederlands Waar!


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op donderdag 24 januari 2002 10:29 schreef Bananeman2002 het volgende:

[..]

Het is wel C++ waar we het over hebben, dus:

char* bestandchar = new char[j + 1];

De +1 is om een trailing zero te kunnen hebben om het einde van de string aan te geven. Om het geheugen vrij te geven doe je:

delete[] bestandchar;

Lees anders eens een boekje over C++, dit is echt basiskennis. Verder wordt het een ander verhaal als het een unicode-string is, dan moet alles keer twee enzo.
Nou nou collega, :) Unicode is helemaal niet maal 2. Is gewoon new wchar_t[j+1].

Sowieso kun je memory&copy tegelijk doen met
code:
1
2
std::vector<char> array(bestand.c_str(),
                bestand.c_str()+bestand.length() );

En dan is &array[0] gewoon een char* naar kopie van je string. Die is dan gewoon bruikbaar alsof je een
char[precies_de_goede_grootte] had.

Maar waarom zou je met char*s willen klooien?

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


  • Bananeman
  • Registratie: Juli 2000
  • Niet online
Op donderdag 24 januari 2002 14:57 schreef MSalters het volgende:

[..]
Nou nou collega, :) Unicode is helemaal niet maal 2. Is gewoon new wchar_t[j+1].
Waarde collega :) ,

natuurlijk is het zo dat je wchar_t moet gebruiken, maar als je dat niet zou doen en het zaakje zou benaderen met een char*, dan is het dus wel maal 2.

Dat je zoiets in de praktijk niet doet is een tweede, maar ik wilde de OP niet afschrikken met nog meer zaken aan zijn hoofd aangezien zelfs memory allocation een probleem voor hem vormde. Overigens gebruik ik in de praktijk zelf vrijwel altijd Unicode.

Motor-forum.nl


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 01:47
Op donderdag 24 januari 2002 11:02 schreef Skinkie het volgende:
Heb je ook nog een boeken tip? :+
Niet specifiek, maar Academic Service heeft meestal wel goedkope, eenvoudige maar complete boeken. Ik zou zeggen, ga zelf even in een boekenwinkel kijken welk boek je wel bevalt. Jij hebt waarschijnlijk het meeste baat bij een boek waar C++ volledig in wordt uitgelegd (dus niet zomaar een reference guide), maar dat wel als referentie te gebruiken is.

Maar nogmaals, dat kun je het beste zelf beoordelen als je wat verschillende boeken doorbladert. Ik kan je afraden om een boek te kopen waar veel dingen in staan die je niet meer dan één keer nodig gaat hebben.
Pagina: 1