Morjens taas vaan :D
Eli olisi ongelma: Haluaisin käsitellä tietoa merkki kerrallaan, mieluusti kuitenkin niin, että tiedot ovat string-taulukossa (jokainen rivi omassa alkiossaan). Onko tuohon jotain vippaskonstia, että voisin katsella string-taulukon alkiosta merkki-kerrallaan tietoa?
Voit käsitellä sitä char-taulukon tapaan, eli teksti[3] on teksti-muuttujan neljäs merkki. Char-osoittimen saa tarvittaessa: teksti.c_str().
Sitten on hyvä vielä muistaa, että STL-kirjasto bugittaa. c_str() -pointteriin liityvä bugin kaa pitää taiteilla seuraavan ohjesäännön mukaan:
AnsiString::c_str() returns a non const temporary pointer to the internal string buffer in the AnsiString object. The pointer is invalid once the statement in which it is used has finished executing. That is,don't do something like this: char* cp = Edit1->Text.c_str(); char* cp2 = strtok( cp, " \t\n" ); // cp may no longer be valid If you need a persistent pointer, you MUST copy the string into its own buffer: char* cp = new char[ Edit1->Text.Length() + 1 ]; strcpy( cp, Edit1->Text.c_str() );
No siis, sehän juuri ei bugita, vaan toimii kuten sanotaan. Käytännössä en keksi yhtään syytä, minkä takia tuolla olisi käytännön merkitystä. Jos kerran käyttää string-luokkaa, niin käsittelee sitä sitten stringinä, kunnes tarvitsee muunnosta, ja silloinhan sitä ei tavita kuin yhden lauseen ajan.
Lisäksi voi olettaa, että tuokin "ohjesääntö" on hieman kärjistetty ja puutteellinen. Uskallan väittää, että sama osoitin kelpaa, kunnes tekstin sisältö muuttuu. Eihän STL:llä ole mitään syytä siirtää koko tekstiä muistissa, jos se ei tarvitse lisätilaa.
Jos oikeasti on liian vaivalloista kirjoittaa aina teksti.c_str(), voi määritellä lyhyemmän nimen definellä:
#define str (teksti.c_str())
// koodia...
#undef str
Juuh, totuus on varmaan vähän kaunisteltu, koska huonosti toimivaa ei kannata kovin suurella äänellä mainostaa. Kuitenkin ihan todellisessa projektissa törmäsin siihen raakaan tosiasiaan, että c_str() -metodin palauttama merkkijono sisälsi mitä milloinkin. Vaikka debugasi hiki hatussa, ei vain löytynyt syytä, miksi tai kuka merkkijonoa oli käynyt muuttamassa.
Tuo pieni tarkennus vain sen vuoksi, ettei kukaan muu ryhdy sitten turhan takia asian kaa kättä vääntämään. Tuo manööveri on lisätty STL:n ohjeistukseen kohtalaisen hiljattain, koska koodaajat ympäri ämpäri Tellusta ovat kasvattaneet harmaita hiuksia sen vuoksi.
Mun mielestä tuollainen ohjesääntö olisi pitänyt ohjeissa mainita jo kauan sitten, eikä vasta sitten, kun riittävän moni on tuon sietämättömän asian kanssa joutunut tekemisiin.
Jos stringssä on vaikka luku 12:34, niin c_str() -pointteri voi osoittaa merkkijonoon, jossa on luku 12:3. Sitten se nelonen on hukassa, eikä mikään auta, vaikka kuinka debugaisi. Kaikkein mukavinta tässä seikassa on se, että c_str():llä katsottuna merkkijono tuntuu käyttäytyvän enemmän tai vähemmän satunnaisesti.
Ahaa, eli jos haluan neljännen merkin neljänneltä riviltä, voin käyttää
munStringi[3][3];
Jotenkin tuntuu että en, joten varmaan tyydyn purkkaan, joka kerralla kun silmukka menee läpi, niin otan rivin erilliseen stringiin, josta sitten merkki-kerralla tutkiskelen tapahtumia. Kylläpäs aiheesta kehkeytyi keskustelu :)
Kyllä, juuri noin.
int main(void) { string str_taulu[3] = { "Matti", "Pekka", "Lasse" }; cout << str_taulu[0][0] // 1. rivin 1. merkki = M << str_taulu[1][1] // 2. rivin 2. merkki = e << str_taulu[2][2] // 3. rivin 3. merkki = s << str_taulu[0][3] // 1. rivin 4. merkki = t << str_taulu[1][4] // 2. rivin 5. merkki = a << endl; // Rivinvaihto return 0; }
Aihe on jo aika vanha, joten et voi enää vastata siihen.