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