Szövegek C++ -ban, a string osztály



Hasonló dokumentumok
Programozás II. 2. Dr. Iványi Péter

Programozás II. 4. Dr. Iványi Péter

Programozás C++ -ban

Programozás C++ -ban 2007/1

Bevezetés a programozásba I.

Programozás C és C++ -ban

Programozás alapjai gyakorlat. 4. gyakorlat Konstansok, tömbök, stringek

Programozás alapjai C nyelv 5. gyakorlat. Írjunk ki fordítva! Írjunk ki fordítva! (3)

Programozás C++ -ban

Programozás alapjai. 5. előadás

Programozás C- és Matlab nyelven C programozás kurzus BMEKOKAM603 Mutatók. Dr. Bécsi Tamás 7. Előadás

1. Alapok. Programozás II

Programozás C és C++ -ban

Programozás 6. Dr. Iványi Péter

Programozás I gyakorlat

Járműfedélzeti rendszerek II. 3. előadás Dr. Bécsi Tamás

Miről lesz ma szó? A PROGAMOZÁS ALAPJAI 1. Dinamikus változók. Dinamikus változók. Dinamikus változók. Dinamikus változók. 7.

C string műveletek (string.h alkalmazása)

Függvény pointer. Feladat: Egy tömbben soroljunk fel függvényeket, és hívjuk meg valahányszor.

Programozási alapismeretek :: beadandó feladat. Felhasználói dokumentáció. Molnár Tamás MOTIABT.ELTE

C programozási nyelv Pointerek, tömbök, pointer aritmetika

A C++ szigorúbban kezeli a típuseltéréseket, mint a C nyelv Lehetséges típuskonverziók:

7. fejezet: Mutatók és tömbök

Programozás I. gyakorlat

A C programozási nyelv I. Bevezetés

A C programozási nyelv I. Bevezetés

117. AA Megoldó Alfréd AA 117.

A C programozási nyelv VI. Parancssori argumentumok File kezelés

Programozási nyelvek I. 5. előadás (Gregorics Tibor anyagának felhasználásával)

Sztringkezelő függvények. A string típusú változók kezelése, használata és szerepük a feldolgozás során

Maximum kiválasztás tömbben

Írjon olyan programot a standard könyvtár alkalmazásával, amely konzolról megadott valós adatokból meghatározza és kiírja a minimális értékűt!

5. Gyakorlat. struct diak {

Bevezetés a programozásba II. 5. Előadás: Másoló konstruktor, túlterhelés, operátorok

7/8. gyakorlat Karaktertömbök és sztringkezelés

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós május 6. Széchenyi István Egyetem, Gy r

Bevezetés a programozásba. 8. Előadás: Függvények 2.

Programozás alapjai C nyelv 8. gyakorlat. Mutatók és címek (ism.) Indirekció (ism)

Programozás C++ -ban 2007/4

Mutatók és címek (ism.) Programozás alapjai C nyelv 8. gyakorlat. Indirekció (ism) Néhány dolog érthetőbb (ism.) Változók a memóriában

1. Template (sablon) 1.1. Függvénysablon Függvénysablon példányosítás Osztálysablon

Programozás II gyakorlat. 8. Operátor túlterhelés

Programozás. (GKxB_INTM021) Dr. Hatwágner F. Miklós április 4. Széchenyi István Egyetem, Gy r

Programozás alapjai C nyelv 4. gyakorlat. Mit tudunk már? Feltételes operátor (?:) Típus fogalma char, int, float, double

500. AA Megoldó Alfréd AA 500.

A verem (stack) A verem egy olyan struktúra, aminek a tetejéről kivehetünk egy (vagy sorban több) elemet. A verem felhasználása

C++ programozási nyelv Struktúrák a C++ nyelvben Gyakorlat

A C programozási nyelv III. Pointerek és tömbök.

Pénzügyi algoritmusok

Programozás C++ -ban

Pénzügyi algoritmusok

Programozás I gyakorlat. 10. Stringek, mutatók

Bevezetés a programozásba 2

A C programozási nyelv III. Pointerek és tömbök.

Pénzügyi algoritmusok

Mit tudunk már? Programozás alapjai C nyelv 4. gyakorlat. Legnagyobb elem keresése. Feltételes operátor (?:) Legnagyobb elem keresése (3)

Informatika terméktervezőknek

0.1. Mi az a standard be- és kimenet? A két mintafeladat leírása

Fejlett programozási nyelvek C++ Iterátorok

Osztályok. 4. gyakorlat

Programozás C nyelven FELÜLNÉZETBŐL elhullatott MORZSÁK. Sapientia EMTE

Java II. I A Java programozási nyelv alapelemei

Objektumorientált Programozás IV.

C++ programozási nyelv Konstruktorok-destruktorok

Országzászlók (2015. május 27., Sz14)

Járműfedélzeti rendszerek II. 1. előadás Dr. Bécsi Tamás

Programozás alapjai II. (4. ea) C++

Objektum Orientált Programozás IV.

main int main(int argc, char* argv[]) { return 0; } main return 0; (int argc, char* argv[]) main int int int main main main

Programozás C és C++ -ban

A feladat lényege egy felhasználói típusnak a zsák típusnak a megvalósítása.

Programozás I. 5. Előadás: Függvények

C programozás. 6 óra Függvények, függvényszerű makrók, globális és

Bevezetés a programozásba I 10. gyakorlat. C++: alprogramok deklarációja és paraméterátadása

Tartalom Keresés és rendezés. Vektoralgoritmusok. 1. fejezet. Keresés adatvektorban. A programozás alapjai I.

Programozás C nyelven (10a. ELŐADÁS) Sapientia EMTE

A C programozási nyelv V. Struktúra Dinamikus memóriakezelés

Vezérlési szerkezetek

Programozási nyelvek Java

1. Feladat: beolvas két számot úgy, hogy a-ba kerüljön a nagyobb

Pál László. Sapientia EMTE, Csíkszereda, 2014/2015

Programozás II. ATM példa Dr. Iványi Péter

STL gyakorlat C++ Izsó Tamás május 9. Izsó Tamás STL gyakorlat/ 1

Keresés és rendezés. A programozás alapjai I. Hálózati Rendszerek és Szolgáltatások Tanszék Farkas Balázs, Fiala Péter, Vitéz András, Zsóka Zoltán

Programozás II. 2. gyakorlat Áttérés C-ről C++-ra

Programozás alapjai 9.Gy: Struktúra 2.

A szemantikus elemzés helye. A szemantikus elemzés feladatai. A szemantikus elemzés feladatai. Deklarációk és láthatósági szabályok

1. Írjunk programot mely beolvas két egész számot és kinyomtatja az összegüket.

AA MEGOLDÓ ALADÁR AA

Programozás alapjai. (GKxB_INTM023) Dr. Hatwágner F. Miklós augusztus 29. Széchenyi István Egyetem, Gy r

Bánsághi Anna 2014 Bánsághi Anna 1 of 68

2018, Funkcionális programozás

- 1 - Konstansok használata. Döntsük el, van-e fordítási idejű hiba az alábbi programrészletekben! a) const char * str="zh"; str[0]++;

Objektum elvű alkalmazások fejlesztése Kifejezés lengyel formára hozása és kiértékelése

C programozási nyelv

HORVÁTH ZSÓFIA 1. Beadandó feladat (HOZSAAI.ELTE) ápr 7. 8-as csoport

Szoftvertechnológia alapjai Java előadások

Programozás C++ -ban 2007/7

500. CC Megoldó Alfréd CC 500.

Programozás C nyelven (10. ELŐADÁS) Sapientia EMTE

Átírás:

Szövegek C++ -ban, a string osztály A string osztály a Szabványos C++ könyvtár (Standard Template Library) része és bár az objektum-orientált programozásról, az osztályokról, csak később esik szó, a string osztály használatát már most elkezdhetjük. Az osztály bemutatásánál csak kódrészletet használunk, de a file végén teljes mintaprogramok találhatók. A string típus (osztály) használatához a string include file-t kell betölteni. Ha egy string adattal akarunk valamilyen műveletet végezni akkor a kovetkező formát kell használni: stringváltozó.művelet(argumentumok) Egy szöveget lehet inicializálni a C nyelvnek megfelelően, de egyéb speciális módok is léteznek:... string s0 ; // üres szöveg string s00 = ""; // szintén üres szöveg string s1 = a ; // HIBA: nincs konverzió karakterből string s2 = 7 ; // HIBA: nincs konverzió egész számból string s3(7); // HIBA: nincs konstruktor egész számmal // exotikusabb szöveg megadások // --------------------------------------------------- // a karakter másolata 7-szer; vagyis "aaaaaaa" string s4(7, a ); string s5 = "Frodo"; // "Frodo" másolata kerül bele string s6 = s5; // s5 másolata lesz // s5[3] és s5[4]; vagyis s7 == "do" string s7(s5, 3, 2); A szövegben előforduló karakter számozása nullával kezdődik és a hossz-1 ig tart. Az utolsó karakternek nem kell zérusnak lennie mint a C nyelvben, az osztály tudja magáról hogy milyen hosszú. A hossz megállapítására a length() vagy a size() függvény alkalmas. A szövegben egy karaktert többféleképpen érhetünk el, at() függvénnyel vagy hagyományos módon, két szögletes zárójel között [ ]. A fő különbség, hogy az at() függvény használata biztonságosabb, mivel a függvény ellenőrzi hogy az elérni kívánt karakter indexe érvényes-e. Ha nem érvényes indexet adunk meg akkor az osztály egy kívételt dob. (Ez most még csak annyit jelent hogy hibával leáll a program.)

Az értékadás szövegeknél is működik, bár az értékadásnál a jobb oldali szöveg átmásolódik a bal oldali szövegbe! string s1 = Alma ; string s2 = ToT ; s1 = s2; // átmásoljuk a ToT szöveget s2[1] = u ; // s2 értéket: TuT, de s1 értéke: ToT Karaktert is használhatunk az értékadásnál, de inicializálásnál nem! string s = a ; //HIBA: karakterrel nem lehet s = a ; s = a ; s = s; Kétféle módon lehet egy string objektumot C-s szöveggé konvertálni, a data() és a c_str() függvényekkel. A data() függvény lényegében azt csinálja, hogy a string osztályban levő szöveget egy belső tömbbe másolja és ennek a tömbnek a címét adja vissza a függvény. Ezt tömböt a felhasználónak nem szabad felszabadítania! A c_str() függvény annyiban különbözik, hogy a tömb végére beilleszti a zérus karaktert is míg a data() függvény nem. Nézzünk néhány példát: string s= 123456 ; // hossza: s.length() == 7 // p a karaktersorozatra mutat const char *p1 = s.data(); p1[1] = a ; // HIBA: mivel a p1 tömb konstans // HIBA: mivel nincs záró zérus \0 karakter printf( p1 = %s\n, p1); // a helyes módszer ebben az esetben const char *p2 = s.c_str(); printf( p2 = %s\n, p2); A fenti példa alapvetően azt is jelenti, hogy inkább a c_str() függvényt használjuk. Egy másik tanács, hogy ameddig lehet inkább hagyjuk a szöveget a string osztályban, és csak ha nagyon kell akkor konvertáljuk C s karakter lánccá. string s = 123 ;

int i = atoi(s.c_str());... A szövegek összehasonlítása igen egyszerű, mert csak a relációs operátorokat kell használni: >, <, ==,!=, <=, >=. Ugyanakkor létezik egy compare() függvény is melynek a függvény overloading-nak köszönhetően nagyon sokféle változata van. Fontos, hogy mind a két módszer a kis és a nagy betűk között különbséget tesz! A szövegek összefűzésére a + vagy a += operátor használható: string nev = Ivanyi ; nev = nev + ; nev += Peter ; Ezen kívül használható az insert() és az append() függvény is szöveg beillesztésére és szöveg összefűzésre. Ugyanakkor fontos arra emlékezni, hogy a függvények használata általában memória foglalást és memória másolást is igényel. Például ha rossz sorrendben állítjuk össze a nevet: string nev = Peter ; s.insert(s.begin(), ); s.insert(0, Ivanyi ); Nagyon sokféle kereső függvény áll rendelkezésre az osztályban, de nézzünk csak egy egyszerűt: string s= abcdefg ; int i=s.find( cd ); // Az eredmény: // i = 2 // mivel: // s[2] == c && s[3] == d A szöveg egy részének lecserélésére a replace() függvény alkalmas. Itt is a könnyebség kedvéért különböző méretű szövegeket lehet lecserélni. Egy rész szöveg meghatározására a substr() függvény alkalmas. string s= abcdefghijk ; cout << s.substr(0, 2); // ab

Mintapéldák 1. Szövegek inicializálása és egymáshoz rendelése string string1("hello World"); string string2; // üres szöveg: cout << string1 << - << string2 << endl; string2 = string1; cout << string1 << - << string2 << endl; // C-s szöveg hozzárendelése string2 = "Hello world"; cout << string1 << - << string2 << endl; 2. Konverzió C s karakter sorozattá string string1("hello World"); // a pointernek konstansnak kell lennie // erre még visszatérünk char const *cstring = string1.c_str(); // C s szöveget így is ki lehet nyomtatni! cout << cstring << endl;

3. Szöveg elemeinek elérése string string1("hello World"); string1[6] = 'w'; if(string1[0] == 'H') string1[0] = 'h'; // "Hello world" // "hello world" // *string1 = 'H'; // Ez érvénytelen!!! string1 = "Hello World"; string1.at(6) = string1.at(0); // "Hello Horld" if(string1.at(0) == 'H') string1.at(0) = 'W'; // "Wello Horld" 4. Szövegek összehasonlítása string string1("hello World"); string string2; if(string1!= string2) string2 = string1; if(string1 == string2) string2 = "Something else"; if(string1.compare(string2) > 0)

cout << "string1 a string2 utan van az ABC-ben\n"; else if(string1.compare(string2) < 0) cout << "string1 a string2 elott van az ABC-ben\n"; else cout << "Azonos szövegek\n"; // Vagy másképpen: if(string1 > string2) cout << "string1 a string2 utan van az ABC-ben\n"; else if(string1 < string2) cout << "string1 a string2 elott van az ABC-ben\n"; else cout << " Azonos szövegek \n"; 5. Részszövegek összehasonlítása A compare függvény egyik változata: string1.compare(pos, n, string2) ahol a pos érték adja meg hogy a string1 szövegben hányadik karaktertől indul az összehasonlítás, az n érték határozza meg, hogy hány darab karaktert vegyünk figyelembe és string2 a másik szöveg amivel a string1-et összehasonlítjuk. string stringone("hello World"); // bizonyos offset-től kezdve végezzük az // összehasonlítást if (!stringone.compare(1, stringone.length() - 1, "ello World")) cout << "'Hello world' osszehasonlitasa 1 indextol" " az 'ello World' szoveggel: ok\n"; else cout << "Nem egyenlo\n"

6. Szövegek összefűzése string stringone("hello"); string stringtwo("world"); stringone += " " + stringtwo; cout << stringone << endl; stringone = "hello"; stringone.append(" world"); // csak 5 karaktert fuz hozza!!! stringone.append(" ok. >Ez bizony kimarad<", 5); cout << stringone << endl; string stringthree("hello"); // hozzafuzzuk a " world" szot // 5. poziciotol 6 karakter stringthree.append(stringone, 5, 6); cout << stringthree << endl; 7. Szövegek beillesztése Az insert függvény egyik változata: string1.insert(pos1, string2, pos2, n2) ahol a pos1 érték adja meg hogy a string1 szövegben hányadik karaktertől indul a beillesztés, a string2 adja meg hogy melyik szövegből vesszük ki a beillesztendő szöveget, a pos2 érték adja meg hogy a string2 szövegben hányadik karaktertől vesszük ki a szöveget és az n2 érték határozza meg, hogy hány darab karaktert vegyünk ki a string2 szövegből.

string stringone("hell ok."); // az "o " beillesztése a 4. pozícióba stringone.insert(4, "o "); string world("the World of C++"); // a "World" beillesztése a stringone -ba stringone.insert(6, world, 4, 5); cout << "Mi az eredmény? Ez: " << stringone << endl; 8. Szövegek cseréje Az alábbi egy olyan program melyet két argumentummal kell elindítani, majd szövegeket kell begépelni. A program a begépelt sorokban az első argumentumban megadott szöveget keresi és lecseréli a második argumentumban megadott szövegre. A program a megváltoztatott sort nyomtatja ki. #include <cassert> int main(int argc, char **argv) if(argc!= 3) cout << "Felhasznalas: "<< endl; cout << "program <regi> <uj>" << endl; cout << "A begepelt szovegben a <regi> szoveget" "lecsereli <uj> -ra" << endl; return 1; string line; // ezt a szöveget keressük string search(argv[1]); // erre fogjuk lecserélni a keresett szöveget string replace(argv[2]); // meggyőződünk arról, hogy a régi és az új szöveg // nem azonos assert(search!= replace);

// olvasunk amíg véget nem ér while(getline(cin, line)) // ez a pozíció a beolvasott sorban string::size_type idx = 0; while(true) // az idx pozíciótól keressük a szöveget // a visszatérési érték is index lesz idx = line.find(search, idx); // ha a sor végére értünk, akkor // nem találtuk meg a szöveget if (idx == string::npos) break; // végrehajtjuk a cserét line.replace(idx, search.size(), replace); // az indexet is módosítjuk, // a cserélt szöveg utánra állítjuk idx += replace.length(); // kiírjuk a módosított sort cout << line << endl; 9. Rész szövegek képzése string stringone("hello World"); cout << stringone.substr(0, 5) << endl << stringone.substr(6) << endl << stringone.substr() << endl;

10. Szöveg hossza string stringone("hello World"); cout << "A stringone string hossza " << stringone.size() << " karacter\n";