Toon posts:

[C++] Van string naar een non-const char*?

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

Verwijderd

Topicstarter
We zijn bezig met een school opdracht.
En ik ondervind daar een probleem.

Ik heb een grote lap tekst van het type string (C++ string).
Ik heb daar eerst met substr() een stuk tekst uitgehaald.
Nu geeft de functie .c_str() een c string terug, maar dat is een constante. (const char * ).

Nu vereist een ander deel van het programma een non-constante (char * ).

Hoe converteer ik dit?

Ik heb het al geprobeerd te casten naar een (char* ) maar als ik dat doe krijg ik al uitvoer een hoop rare tekens :'(

Zijn er misschien oplossing voor? (Zowel smerige als normale oplossingen welkom :P)

Ik ben nu al 2 dagen aan het zoeken (dus heb google enz al gehad), maar ik kom er niet uit. Hopelijk kan mij iemand helpen.

Verwijderd

sprintf naar 'eigen buffer'

  • Total-Control
  • Registratie: September 2000
  • Laatst online: 03-06-2025
even iets meer info. Type casten moet makkelijk gaan.
Zeker bij pointers. Welke methode gebruik je voor het afbeelden van je string. Post anders even het relevante gedeelte van de code die je gemaakt hebt.

Getting it hot makes it work, keeping it cold makes sure it stays that way.


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Gebruik de functie strcpy() deze kan van een const char* naar een char* schrijven.

Gebruik NOOIT casts om de const weg te werken. Dit is gewoonweg vragen om problemen.

Verwijderd

Topicstarter
Ik heb zo ongeveer dit (alleen relavant spul)

typedef char * Chars;

function GetValue ( Chars& val )
{
int startPos, endPos;
string doc = "blablablab<?blabla?> lange doc, blablablabla";

startPos = doc.find("<?", 0);
endPos = doc.find("?>", startPos);
val = (char*)(doc.substr(startPos, endPos)).c_str();
}

Ik krijg nu dan een hele boel rotzooi.
Ik heb al geprobeerd met strcpy, maar dan hangt het programma.

Dit werkte dus ook niet:
strcpy (val, (doc.substr(startPos, endPos)).c_str());


:'(

  • Total-Control
  • Registratie: September 2000
  • Laatst online: 03-06-2025
Ok, dit heb ik alvast net even gemaakt en getest.
Werkt!

#include <string>
#include <stdio.h>

void main(void)
{
string my_string = "Hello World";
char *normal_string = (char * ) my_string.data();
printf("Dit is de string: %s\n",normal_string);
}


Ik zal meteen even je stukje code gaan bekijken :9~
Even geduld A.U.B.

Getting it hot makes it work, keeping it cold makes sure it stays that way.


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Je hebt de haakjes ietsjepietsje verkeerd:
code:
1
strcpy(val, doc.substr(startPos, endPos).c_str());

:Y)

  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op zaterdag 08 juni 2002 19:41 schreef Total-Control het volgende:
Ok, dit heb ik alvast net even gemaakt en getest.
Werkt!

#include <string>
#include <stdio.h>

void main(void)
{
string my_string = "Hello World";
char *normal_string = (char * ) my_string.data();
printf("Dit is de string: %s\n",normal_string);
}


Ik zal meteen even je stukje code gaan bekijken :9~
Even geduld A.U.B.
Oei ... en wat nou als std::string besluit zijn string ergens anders op te slaan?

  • eenTurk
  • Registratie: Januari 2000
  • Laatst online: 28-02-2025

eenTurk

Intel Inside = *** outside

gebruik dan gewoon const_cast<char *> variabele naam
Dit is een ANSI C++ operator en zelfs MS VC++ ondersteunt het >:)

Deze zal jou const variabele casten naar een 'normale' variabele en hij werkt gegarandeerd.
:9

Audi C5 3.0 + Audi C4 2.3 nog 2 ringen te gaan :)


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op zaterdag 08 juni 2002 19:44 schreef eenTurk het volgende:
gebruik dan gewoon const_cast<char *>
:r
:X

  • eenTurk
  • Registratie: Januari 2000
  • Laatst online: 28-02-2025

eenTurk

Intel Inside = *** outside

Op zaterdag 08 juni 2002 19:46 schreef Orphix het volgende:

[..]

:X
Huh...
wat moet ik hiermee, heb ik je nou wel of niet kunnen helpen ¿¿¿

BTW: Ik heb mijn bericht gewijzigd, omdat ik een verkeerde smilie had gebruikt. Dit :r was niet mijn bedoeling

Audi C5 3.0 + Audi C4 2.3 nog 2 ringen te gaan :)


  • Orphix
  • Registratie: Februari 2000
  • Niet online
Op zaterdag 08 juni 2002 19:48 schreef eenTurk het volgende:

[..]

Huh...
wat moet ik hiermee, heb ik je nou wel of niet kunnen helpen ¿¿¿

BTW: Ik heb mijn bericht gewijzigd, omdat ik een verkeerde smilie had gebruikt. Dit :r was niet mijn bedoeling
Nouja je hoeft mij niet te helpen ;)

Maar ik maakte eerder al een opmerking dat een const wegcasten vaak side-effecten/bugs met zich meebrengt die erg moeilijk te traceren zijn.
In een goed design is er een reden dat je dat object niet mag wijzigen. C++ biedt wel een mogelijkheid om dit te omzeilen (gelukkig) maar dit betekent nog niet dat je het daarom ook maar gebruikt.
In dit geval is het beter en ook nog makkelijk om gewoon een copy te maken van de string en daarmee verder te werken.

  • eenTurk
  • Registratie: Januari 2000
  • Laatst online: 28-02-2025

eenTurk

Intel Inside = *** outside

ik heb in ieder geval onder MS VC++ 6 en .NET geen enkele probleem gehad met zulke constructies. Vandaar mijn reactie.

Audi C5 3.0 + Audi C4 2.3 nog 2 ringen te gaan :)


  • Total-Control
  • Registratie: September 2000
  • Laatst online: 03-06-2025
Oke, klaar!

#include <stdio.h>
#include <string>

void GetValue ( char * val )
{
int startPos, endPos;
string doc = "blablablab<?blabla?> lange doc, blablablabla";

startPos = doc.find("<?", 0);
endPos = doc.find("?>", startPos);
strncpy(val, (doc.substr(startPos, endPos-startPos+2)).c_str(), (doc.substr(startPos, endPos-startPos+2)).length());
}

void main(void)
{
char *DataDump = new char[100];
GetValue(DataDump);
printf("Hier is de data: %s\n", DataDump);
delete DataDump;
}

Let wel, dit is zeker niet netjes nee. Maar als we
alles netjes moeten doen, zijn we morgen nog niet klaar.
Je zal een en ander moeten beveiligen. De 100 bytes die
ik reserveer zou je eerst moeten bepalen en vervolgens dynamisch moeten toewijzen. Verder moet je zaken controleren als string lengtes en of er geen null-pointers worden teruggegeven, anders heb je zo een exception te pakken; goedkoop truukje is dan try en catch, maar dat vind ik
persoonlijk nogal :r

Succes er mee!

Getting it hot makes it work, keeping it cold makes sure it stays that way.


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 18:44
[ Andere reacties missen essentie van probleem ]
Er zijn grofweg twee mogelijkheden:

1) Of de andere code (die een char* wil ) wil naar dat adres schrijven, of
2) de andere code wil niet naar dat adres schrijven.

In geval 1 kun je c_str() niet gebruiken; de return value wijst soms naar een temporary. Als je daar naar schrijft gaat het gewoon fout. Daarom is het type ook const char*. Casten verbergt de bug gewoon.

In geval 2 moet de andere code gefixed worden zodat die een const char* accepteert. Dan kun je vervolgens de c_str() return value gebruiken.

Welk van de twee gevallen is het?

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