Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys

13.6.2 C++ - merkkijonon muuttaminen C- jonoksi

Toisensuuntainen muunnos ei yleensä onnistu. C++ - merkkijonosta kyllä saadaan tilapäinen osoitin vastaavaan VAKIO C- merkkijonoon, jota voidaan käyttää hyväksi aliohjelmakutsuissa, joiden parametrilistassa on vakiomerkkijono:

c-taul\cpp2c.cpp - C++ -merkkijonojen käyttö C-merkkijonoja vaativissa kutsuissa

	#include <iostream.h>
	#include <string>
	#include <string.h>
	using namespace std;
	
	int montako_pta(const char *s)
	{ /* oikein C:mäinen */
	  int i,n = 0;
	  for (i=0; s[i]; i++) n +=  s[i] == 'p';
	  return n;
	}
	
	void muuta_eka(char s[])
	{
	  s[0] = 'R';
	}
	
	int main(void)
	{
	  string cppS1("Kolme porsasta padassa porisee pippurikastikkeen kera!");
	
	  int p_lkm = montako_pta(cppS1.c_str());
	  cout << "Jonossa oli " << p_lkm << " kpl p-kirjaimia\n";
	
	//  muuta_eka(cppS1.c_str()); // Ei onnistu! Täytyy tehdä apumuuttujan kautta
	  char cs[100];
	  strncpy(cs,cppS1.c_str(),100); cs[99] = 0;
	  muuta_eka(cs);
	  cppS1 = cs;
	  cout << cppS1 << endl;
	
	  return 0;
	}

Muoto jono.c_str() palauttaa nimenomaan osoittimen vakiomerkkijonoon. Tämän osoittimen elinikää ei taata, korkeintaan se elää niin kauan kuin vastaava jonokin. Kuitenkin esimerkiksi edellä joka tapauksessa aliohjelmakutsujen ajan. Tilanne on hankalampi jos jonoa pitää muuttaa, koska (onneksi) kääntäjä ei hyväksi tätä osoitinta muuttuvan merkkijonon tilalle kutsussa. Tällöin ainoaksi mahdollisuudeksi jää tehdä C++- jonosta itse tilapäinen kopio C- merkkijonoksi ja käyttää tätä jonoa aliohjelman parametrinä ja aliohjelman jälkeen sitten sijoitetaan tilapäinen jono takaisin alkuperäiseen.

Jos useasti pitää kutsua samaa C- aliohjelmaa C++ - merkkijonolla, kannattaa tehdä "välittäjä"funktio, joka tekee em. kopioinnin. Funktioiden nimien kuormittamisen ansiostahan tämä välittäjäfunktio voidaan tehdä samalle nimelle. Tätä tekniikkaa on käytetty mm. muutettaessa mjonot.c:n funktioita C++:ksi kirjastossa mjonotpp.h.

Tehtävä 13.126 Välittäjäfunktio

Kirjoita C++ jonon hyväksyvä funktio muuta_eka käyttäen hyväksi cpp2c.cpp:n C- funktiota muuta_eka.

Ylös Edellinen Seuraava Otsikkosivu Hakemisto Sisällys