13. Simbolių eilutės
Simbolių eilutė string
Darbui su simbolių eilutėmis yra sukurta klasė (tipas) string. Failas, kuriame yra aprašyta klasė string, į programą įterpiamas sakiniu
#include <string>
Simbolių eilučių tipo kintamieji (objektai) aprašomi taip pat, kaip ir kitų tipų kintamieji, pavyzdžiui,
string eil, e1;
Sukurtos eilutės yra tuščios. Jas aprašant galima priskirti reikšmes, pavyzdžiui,
string eil = "Jau moku programuoti C++ kalba";
Klasės string objektai literatūroje dažnai vadinami C++ eilutėmis. Eilučių simboliai indeksuojami taip pat, kaip ir masyve, t. y. pradedant 0. Darbui su eilutėmis yra naudojami tokie operatoriai:
1) Priskyrimo (=).
Klasės string objektui galima priskirti kitos eilutės ar net simbolio reikšmę. Pavyzdžiui:
string s1, s2;
string s = "12";
char c = 'z';
s1 = s; s2 = c;
Rezultatas – s1 reikšmė ("12") ir s2 reikšmė ("z").
2) Sudėties (+).
Sudedant eilutes s1 ir s2, prie pirmos eilutės pabaigos pridedama antros eilutės kopija. Galima sudėti dvi C++ eilutes arba C++ eilutę ir simbolį. Pavyzdžiui:
string s1 = "a", s2 = "b";
string s = "12"; char c = 'z';
s1 = s1 + s; s2 = s2 + c;
Rezultatas – s1 reikšmė ("a12") ir s2 reikšmė ("bz").
3) Lyginimo (==, != , < ir kt.).
Lyginami eilutes sudarančių simbolių kodai. Dvi eilutės lygios, jei jos yra vienodo ilgio ir sutampa visų jų simbolių kodai poromis. C++ eilutę galima lyginti tik su kita C++ eilute.
Klasės string objektams (kintamiesiems) galima taikyti įvesties srauto operatorių >> ir išvesties srauto operatorių <<.
Operatorius >> įveda į string tipo eilutę simbolių seką iki tarpo arba iki eilutės pabaigos simbolio '\n'.
Pavyzdžiui, jei įvesties sraute fd yra simbolių eilutė „Man patinka C++ programavimo kalba“ tai, atlikę veiksmus
string eil;
fd >> eil; // fd – įvesties srautas
cout << eil;
ekrane matysime eilutę:
Man
Norint įvesti dalį simbolių eilutės (pvz., ne iki tarpo), reikia naudotis globaliaja funkcija getline(). Galimi du šios funkcijos formatai:
istream & getline(istream & fd, string & str); // įveda iki eilutės pabaigos simbolio ‘\n’
istream & getline(istream & fd, string & eil, char skyr); // įveda iki skyriklio simbolio skyr
Tarkime, faile fd yra eilutė
Dangaus laiptelis * Andersenas
Pavyzdys. Veiksmai ir jų rezultatai, rodomi ekrane.
string eil;
fd >> eil; // fd – įvesties srautas
cout << eil;
Rezultatai ekrane: Dangaus
string eil;
getline(fd, eil); // fd – įvesties srautas
cout << eil;
Rezultatai ekrane: Dangaus laiptelis * Andersenas
string eil;
getline(fd, eil, '*'); // fd – įvesties srautas
cout << eil;
Rezultatai ekrane: Dangaus laiptelis
Išvesties srauto operatorius << išveda string tipo eilutę eil:
fr << eil;
Skaitydami tekstą, prarandame eilutės pabaigos simbolį '\n', todėl reikia rašyti:
fr << eil << endl;
Pavyzdžiui, iš srauto fd nukopijuoti n eilučių į srautą fr galima naudojantis šia funkcija:
void KopijuotiSrautoEilutes(ifstream & fd, ofstream & fr, int n)
{
string E;
for (int i = 0; (i < n) && (!fd.eof()); i++) {
getline(fd, E);
fr << E << endl;
}
}
Jei norima iš C++ eilutės paimti atskirus simbolius, tuomet laužtiniuose skliaustuose reikia nurodyti jų indeksus.
Pavyzdžiui, turime eilutę:
string eil = "Skanus agurkas";
Tuomet sakiniu cout << eil[5]; ekrane parodysime eilutės simbolį s, kuris masyve yra 5-oje vietoje (masyvo elementai indeksuojami pradedant nuo 0).
Klasės string funkcijos, dažnai naudojamos darbui su eilutėmis
Funkcijos prototipas | Paaiškinimai |
size_type max_size() const; |
Grąžina elementų, kurie gali būti eilutėje, skaičių. Pavyzdys string s("C++ kalba"); int n = s.max_size(); Rezultatas – n reikšmė: 4294967281. |
size_type length() const; |
Grąžina eilutės ilgį (simbolių skaičių eilutėje). Pavyzdys string s("C++ kalba"); int n = s.length(); Rezultatas – n reikšmė: 9. |
const char * c_str(); |
Grąžina rodyklę-konstantą į C eilutę, kurios reikšmė sutampa su eilute, kuriai taikoma ši funkcija. Naudojama failų atidarymo sakiniuose. Pavyzdys string s = "Duomenys.txt"; ifstream fd(s.c_str()); Rezultatas – eilutė s, konvertuota į C eilutę. |
string substr(size_type k, size_type n = npos); |
Iš eilutės, kuriai taikoma ši funkcija, kopijuojama n simbolių, pradedant k-uoju. Pavyzdys string s = "Programavimo kalba C++"; string s1 = "Matematika"; s1 = s.substr(13, 5); Rezultatas – nauja eilutės s1 reikšmė: "kalba". |