#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 parametrina 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.