// vaihda12.cpp //------------------------------------------------------------------------------ // Testiohjelma merkkijonon 2 ensimm„isen sanan vaihtamiseksi j„rjestykseen // L”ytyy hakemistosta n:\kurssit\cpp\moniste\demo\c-ohj // // Vesa Lappalainen 24.1.1998 // // #include #include using namespace std; //------------------------------------------------------------------------------ string erota(string &jono, char merkki=' ',bool etsi_takaperin=false) // Erottaa jonosta valitun merkin kohdalta alkuosan ja loppuosan. // Alkuosa palautetaan funktion nimess„ ja loppuosa j„tet„„n // jonoon. Merkin etsimissuunta voidana valita (oletuksena alusta p„in). // Jos merkki„ ei l”ydy, palautetaan koko jono ja tyhjennet„„n jono. // K„ytt”esimerkki: olkoon aluksi string jono,s; // 1) jono = "123 456"; s = erota(jono); => jono == "456" s == "123" // 2) jono = "123"; s = erota(jono); => jono == "" s == "123" // 3) jono = "1 2 3"; // while ( jono != "" ) cout << erota(jono) << ","; => tulostaa 1,2,3, // { #if 0 size_t p; if ( !etsi_takaperin ) p = jono.find(merkki); else p = jono.rfind(merkki); if ( p == string::npos ) { string alku = jono; jono.erase(0,jono.length()); return alku; } string alku = jono.substr(0,p); jono.erase(0,p+1); return alku; #else size_t p; if ( !etsi_takaperin ) p = jono.find(merkki); else p = jono.rfind(merkki); string alku = jono.substr(0,p); if ( p == string::npos ) jono = ""; else jono.erase(0,p+1); return alku; #endif } string jarjesta_1_2(const string &jono) { string sanat(jono); // alustus, t„ss„ sama kuin string sanat=jono; string eka = erota(sanat); string toka = erota(sanat); if ( toka == "" ) return eka; if ( eka < toka ) return eka + ' ' + toka; // Huom! "aa" > "AA" return toka + ' ' + eka; } string jarjesta_1_2_nopeampi(const string &jono) { size_t p1 = jono.find(' '); if ( p1 == string::npos ) return string(jono); size_t p2 = jono.find(' ',p1+1); if ( p2 == string::npos ) p2 = jono.length(); string eka(jono,0,p1); string toka(jono,p1+1,p2-p1-1); if ( toka == "" ) return eka; if ( eka < toka ) return eka + ' ' + toka; // Huom! "aa" > "AA" return toka + ' ' + eka; } //------------------------------------------------------------------------------ void testi(const string& jono) // Testaa sukunimen ja etunimen vaihtamista molempiin suuntiin { string vaihdettu = jarjesta_1_2_nopeampi(jono); cout << "|" << jono << "| => |" << vaihdettu << "|" << endl; } //------------------------------------------------------------------------------ int main(int , char **) { testi("Abc Def"); testi("Def Abc"); testi("Abc Def Hijk"); testi("Def Abc Hijk"); testi("Abc"); string jono; while ( 1 ) { cout << "Anna merkkijono>"; getline(cin,jono,'\n'); if ( jono == "" ) break; cout << jarjesta_1_2(jono) << endl; } return 0; }