{"id":1841,"date":"2017-01-06T09:11:44","date_gmt":"2017-01-06T08:11:44","guid":{"rendered":"http:\/\/www.webotlet.hu\/?p=1841"},"modified":"2025-10-18T17:22:22","modified_gmt":"2025-10-18T15:22:22","slug":"c-programozas-16-string","status":"publish","type":"post","link":"https:\/\/www.webotlet.hu\/?p=1841","title":{"rendered":"C++ programoz\u00e1s 16. &#8211; String"},"content":{"rendered":"<h1>String, avagy minden, amit beg\u00e9pelhetsz (vagy nem)<\/h1>\n<p><strong>M\u00e9g nincs ellen\u0151rizve, de felteszem, csak hogy haladni lehessen.<\/strong><\/p>\n<p>A C++ programoz\u00e1si nyelvben, mint megtudhattad, t\u00f6bbf\u00e9le v\u00e1ltoz\u00f3t\u00edpus l\u00e9tezik. Ezek egy r\u00e9sze egyszer\u0171 (primit\u00edv) t\u00edpus, de vannak \u00f6sszetett, komplexebb t\u00edpusok. Ezek egyike a karakterl\u00e1nc, m\u00e1s nev\u00e9n string.<\/p>\n<p>A string egy oszt\u00e1ly, mely karakterek sorozat\u00e1b\u00f3l \u00e1ll, melyek egym\u00e1s ut\u00e1n meghat\u00e1rozott sorrendben karakterl\u00e1ncot alkotnak. Felfoghat\u00f3 \u00fagy is, mint egy t\u00f6mb, karakterek t\u00f6mbje. A stringek nem csak ki\u00edrathat\u00f3 karaktereket tartalmazhatnak, olyanok is lehetnek benne, amelyek nem l\u00e1tszanak, ezekr\u0151l majd k\u00e9s\u0151bb sz\u00f3t ejtek.<\/p>\n<h2>string deklar\u00e1ci\u00f3 \u00e9s \u00e9rt\u00e9kad\u00e1s<\/h2>\n<p>A string deklar\u00e1ci\u00f3ja a k\u00f6vetkez\u0151k\u00e9ppen n\u00e9z ki:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">string s;<\/pre>\n<p>Ett\u0151l a pontt\u00f3l kezdve van egy \u00fcres stringem. Akkor is, ha nem adtam neki semmilyen kezd\u0151\u00e9rt\u00e9ket.<\/p>\n<p>L\u00e1ssuk m\u00e9g milyen m\u00f3don hozhatunk l\u00e9tre stringeket:<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nstring s1 = &quot;&quot;;       \/\/ \u00fcres string l\u00e9trehoz\u00e1sa;\r\nstring s2 = &quot;Bela&quot;;   \/\/ string l\u00e9trehoz\u00e1sa tartalommal\r\nstring s3 = s2;       \/\/ string l\u00e9trehoz\u00e1sa, m\u00e1sik v\u00e1ltoz\u00f3 \u00e9rt\u00e9ke alapj\u00e1n\r\nstring s4 (&quot;gr\u00e1n\u00e1talma&quot;);   \/\/ string l\u00e9trehoz\u00e1sa gr\u00e1n\u00e1talma tartalommal\r\nstring s5 (s4, 6, 4); \/\/ s4-b\u0151l, 6 helyt\u0151l 4 helynyit felhaszn\u00e1lva (alma)\r\nstring s6 (10,'z');   \/\/ 10 darab z karakter elhelyez\u00e9se egy \u00faj stringben\r\n<\/pre>\n<p>Az els\u0151 p\u00e9ld\u00e1ban ugyan\u00fagy egy \u00fcres string-et hozunk l\u00e9tre. A m\u00e1sodik esetben direkt kezd\u0151\u00e9rt\u00e9ket \u00e1ll\u00edtunk meg, a direkt \u00e9rt\u00e9keket liter\u00e1lnak nevezz\u00fck. A harmadik p\u00e9ld\u00e1ban a string \u00e9rt\u00e9k\u00e9nek egy m\u00e1sik string \u00e9rt\u00e9k\u00e9t \u00e1ll\u00edtjuk be. Ez nem azt jelenti, hogy a k\u00e9t v\u00e1ltoz\u00f3 \u00f6ssze van k\u00f6tve. Ha az eredeti s2 string \u00e9rt\u00e9k\u00e9t megv\u00e1ltoztatjuk, az s3 t\u0151le f\u00fcggetlen\u00fcl marad a neki be\u00e1ll\u00edtott \u00e9rt\u00e9ken. A negyedik esetben a stringet az \u00fagynevezett konstruktor\u00e1n kereszt\u00fcl hoztuk l\u00e9tre, ezt ritk\u00e1n fogjuk haszn\u00e1lni, de legf\u0151k\u00e9pp soha. Az \u00f6t\u00f6dik esetben egy stringet egy m\u00e1sik string r\u00e9sz\u00e9t felhaszn\u00e1lva hozzuk l\u00e9tre, szint\u00e9n a konstruktoron kereszt\u00fcl, ez is ritka, az utols\u00f3 eset ink\u00e1bb csak \u00e9rdekess\u00e9g.<\/p>\n<p><strong>A string a C++ nyelvben megv\u00e1ltoztathat\u00f3!<\/strong><\/p>\n<p>Az\u00e9rt emeltem ezt ki, mert m\u00e1s nyelvekben (Java) megv\u00e1ltoztathatatlan (immutable), ami azt jelenti, hogy ha a string megkapta a kezd\u0151\u00e9rt\u00e9k\u00e9t, akkor annak megv\u00e1ltoztat\u00e1sa eset\u00e9n \u00faj string j\u00f6n l\u00e9tre, az eredeti pedig el\u0151bb-ut\u00f3bb a szem\u00e9tbe ker\u00fcl. A C++ nyelvben a stringbe bele tudunk ny\u00falni, \u00e9rt\u00e9k\u00e9t direkt m\u00f3don is megv\u00e1ltoztathatjuk, nem kell hozz\u00e1 met\u00f3dusokat haszn\u00e1lni.<\/p>\n<p>A k\u00f6vetkez\u0151 p\u00e9lda kicsit fura lehet:<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [1,4,7]; title: ; notranslate\" title=\"\">\r\nstring s = &quot;abzd&quot;;\r\ncout &lt;&lt; s &lt;&lt; endl; \/\/ abzd\r\n\r\ns += &quot;efgh&quot;;\r\ncout &lt;&lt; s &lt;&lt; endl; \/\/ abzdefgh\r\n\r\ns&#x5B;2] = 'c';\r\ncout &lt;&lt; s &lt;&lt; endl; \/\/ abcdefgh\r\n<\/pre>\n<p>Azt mondtam, hogy a string megv\u00e1ltoztathat\u00f3. N\u00e9zz\u00fck, mit jelent ez a fenti p\u00e9ld\u00e1ban :<\/p>\n<ul>\n<li>1 &#8211; megadom a string eredeti tartalm\u00e1t \u00e9s hozz\u00e1rendelem az s v\u00e1ltoz\u00f3hoz.<\/li>\n<li>4 &#8211; hozz\u00e1adok (hozz\u00e1f\u0171z\u00f6k) valamit az s v\u00e1ltoz\u00f3 tartalm\u00e1hoz.<\/li>\n<li>7 &#8211; kihaszn\u00e1lom, hogy a string egy karakterl\u00e1nc, vagy karakterek t\u00f6mbje, melynek adott eleme direkt m\u00f3don t\u00f6mbindexel\u00e9ssel hozz\u00e1f\u00e9rhet\u0151, \u00e9s tetsz\u0151legesen m\u00f3dos\u00edthat\u00f3.<\/li>\n<\/ul>\n<h2>string f\u00fcggv\u00e9nyek<\/h2>\n<p>L\u00e1ssuk akkor, hogy mit kezdhet\u00fcnk a stringekkel. A stringek sok f\u00fcggv\u00e9nnyel rendelkeznek, ezekkel lehet kezelni \u0151ket. L\u00e1ssuk akkor ezeket p\u00e9ld\u00e1kon kereszt\u00fcl, hogy melyek ezek, \u00e9s mire is haszn\u00e1lhat\u00f3k. A felsorol\u00e1s nem lesz teljes, de a legfontosabbakat \u00fagy gondolom, hogy tartalmazza.<\/p>\n<ul>\n<li><a href=\"#length\">length()<\/a><\/li>\n<li><a href=\"#clear\">clear()<\/a><\/li>\n<li><a href=\"#empty\">empty()<\/a><\/li>\n<li><a href=\"#==\">==<\/a><\/li>\n<li><a href=\"#append\">stringhez hozz\u00e1f\u0171z\u00e9s &#8211; append(), +=<\/a><\/li>\n<li><a href=\"#at\">string adott karaktere &#8211; at(), []<\/a><\/li>\n<li><a href=\"#compare\">\u00f6sszehasonl\u00edt\u00e1s &#8211; compare(), &gt; = &lt;<\/a><\/li>\n<li><a href=\"#insert\">stringbe besz\u00far\u00e1s &#8211; insert()<\/a><\/li>\n<li><a href=\"#erase\">stringb\u0151l t\u00f6rl\u00e9s (m\u00e9retcs\u00f6kken\u00e9ssel) &#8211; erase()<\/a><\/li>\n<li><a href=\"#substr\">string r\u00e9sz\u00e9nek kinyer\u00e9se &#8211; substr()<\/a><\/li>\n<li><a href=\"#replace\">string adott r\u00e9sz\u00e9nek cser\u00e9je &#8211; replace()<\/a><\/li>\n<li><a href=\"#find\">r\u00e9sz string keres\u00e9se &#8211; find<\/a><\/li>\n<\/ul>\n<h4><a name=\"length\"><\/a>String hossza &#8211; length()<\/h4>\n<p>A C++ nyelvben a string hossz\u00e1t a length() f\u00fcggv\u00e9nnyel kaphatjuk meg. Sz\u00fcks\u00e9ges lehet, ha a string karakterein szeretn\u00e9nk egy ciklussal v\u00e9gigmenni valamilyen m\u00f3dos\u00edt\u00e1s c\u00e9lj\u00e1b\u00f3l. Fontos tudni, hogy ez egy el\u0151jel n\u00e9lk\u00fcli eg\u00e9szet ad vissza, amit ha direkt m\u00f3don haszn\u00e1lunk egy ciklusban, akkor m\u0171k\u00f6dik ugyan, de figyelmeztet\u00e9st k\u00fcld a ford\u00edt\u00e1st v\u00e9gz\u0151 program, hogy nem c\u00e9lszer\u0171 k\u00fcl\u00f6nb\u00f6z\u0151 t\u00edpus\u00fa \u00e9rt\u00e9keket \u00f6sszehasonl\u00edtani. C\u00e9lszer\u0171 a .length() f\u00fcggv\u00e9ny \u00e1ltal visszaadott \u00e9rt\u00e9ket berakni egy int t\u00edpus\u00fa v\u00e1ltoz\u00f3ba, \u00e9s azt haszn\u00e1lni a ciklusban. Erre p\u00e9ld\u00e1t lejjebb, a string adott karaktere pontban l\u00e1thatsz.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nstring s1 = &quot;abrakadabra&quot;;\r\ncout &lt;&lt; s1.length() &lt;&lt; endl; \/\/ 11 a string m\u00e9rete\r\n<\/pre>\n<h4><a name=\"clear\"><\/a>String ki\u00fcr\u00edt\u00e9se &#8211; clear()<\/h4>\n<p>Ezzel lehet egy adott string tartalm\u00e1t t\u00f6r\u00f6lni. \u00cdrok egy p\u00e9ld\u00e1t, de szerintem egy\u00e9rtelm\u0171 a haszn\u00e1lata.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nstring s1 = &quot;abrakadabra&quot;;\r\ncout &lt;&lt; s1 &lt;&lt; endl; \/\/ abrakadabra\r\n\r\ns1.clear();\r\ncout &lt;&lt; s1 &lt;&lt; endl; \/\/ \u00fcres lesz\r\n<\/pre>\n<h4><a name=\"empty\"><\/a>\u00dcres-e a string &#8211; empty()<\/h4>\n<p>Logikai v\u00e1laszt ad, hogy az adott string \u00fcres-e vagy sem. \u00dcres a string abban az esetben, ha frissen deklar\u00e1ltuk, \u00e9s m\u00e9g nincs kezd\u0151\u00e9rt\u00e9ke, ha a &#8220;&#8221; liter\u00e1lt kapta \u00e9rt\u00e9kk\u00e9nt, vagy ha ki\u00fcr\u00edtett\u00fck.<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [1,2,7,8,14,15]; title: ; notranslate\" title=\"\">\r\nstring s1;\r\nif( s1.empty() )\r\n{\r\n    cout &lt;&lt; &quot;A string ures.&quot; &lt;&lt; endl;\r\n}\r\n\r\ns1 = &quot;&quot;;\r\nif( s1.empty() )\r\n{\r\n    cout &lt;&lt; &quot;A string ures.&quot; &lt;&lt; endl;\r\n}\r\n\r\ns1 = &quot;abrakadabra&quot;;\r\ns1.clear();\r\nif( s1.empty() )\r\n{\r\n    cout &lt;&lt; &quot;A string ures.&quot; &lt;&lt; endl;\r\n}\r\n<\/pre>\n<h4><a name=\"==\"><\/a>Stringek egyenl\u0151s\u00e9g\u00e9nek vizsg\u00e1lata &#8211; ==<\/h4>\n<p>A C++ nyelvben a stringek objektumok, de az egyenl\u0151s\u00e9gvizsg\u00e1lat nem olyan szigor\u00fa, mint a Java nyelvben. A C++ nyelvben k\u00e9t string egyenl\u0151s\u00e9g\u00e9nek vizsg\u00e1lata minden esetben a tartalmukat hasonl\u00edtja \u00f6ssze. Hi\u00e1ba k\u00e9t k\u00fcl\u00f6nb\u00f6z\u0151 objektumr\u00f3l van sz\u00f3, melyek m\u00e1s mem\u00f3riater\u00fcleten vannak, az egyenl\u0151s\u00e9g vizsg\u00e1lat oper\u00e1tor a tartalmuk alapj\u00e1n ad igaz vagy hamis \u00e9rt\u00e9ket.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nstring s1 = &quot;abc&quot;;\r\nstring s2 = &quot;abc&quot;;\r\ns1 += &quot;d&quot;;\r\ns2 += &quot;d&quot;;\r\n\r\ncout &lt;&lt; (s1 == s2) &lt;&lt; endl; \/\/ 1, vagyis true\r\n<\/pre>\n<p>L\u00e9trehozok k\u00e9t stringet. Mindkett\u0151h\u00f6z hozz\u00e1f\u0171z\u00f6k egy karaktert. Az == oper\u00e1tor tov\u00e1bbra is azt mondja, hogy a k\u00e9t string egyenl\u0151. Felh\u00edvn\u00e1m a figyelmet arra, hogy az egyenl\u0151s\u00e9g vizsg\u00e1latot z\u00e1r\u00f3jelekbe tettem. En\u00e9lk\u00fcl a program ford\u00edt\u00e1si hib\u00e1val elsz\u00e1ll, ami val\u00f3sz\u00edn\u0171leg a &lt;&lt; (helyezd bele) oper\u00e1torral kapcsolatos.<\/p>\n<h4><a name=\"append\"><\/a>Stringhez hozz\u00e1f\u0171z\u00e9s &#8211; append(), +=<\/h4>\n<p>Sok esetben el\u0151fordul az, hogy egy stringet b\u0151v\u00edteni kell. Van valamilyen kezd\u0151\u00e9rt\u00e9ke &#8211; ak\u00e1r a semmi &#8211; \u00e9s ehhez hozz\u00e1 kell f\u0171zni valamilyen tartalmat. Ezt k\u00e9tf\u00e9lek\u00e9pp is megoldhatjuk. Az els\u0151 gyakorlatilag nem is f\u00fcggv\u00e9ny, csak egy oper\u00e1tor. L\u00e1ssuk az al\u00e1bbi p\u00e9ld\u00e1t:<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [3,6]; title: ; notranslate\" title=\"\">\r\nstring s = &quot;abc&quot;;\r\ncout &lt;&lt; s &lt;&lt; endl; \/\/ abc\r\ns = s + &quot;defhg&quot;;\r\ncout &lt;&lt; s &lt;&lt; endl; \/\/ abcdefgh\r\n\r\ns += &quot;ij&quot;;\r\ncout &lt;&lt; s &lt;&lt; endl; \/\/ abcdefghij\r\n<\/pre>\n<p>L\u00e1that\u00f3, hogy ha a stringhez &#8220;hozz\u00e1adok&#8221; egy m\u00e1sikat, akkor az els\u0151 ut\u00e1n hozz\u00e1f\u0171z\u00f6m a m\u00e1sodikat. Itt m\u0171k\u00f6dik az s = s + &#8220;valami&#8221; \u00e9s az s += &#8220;valami&#8221; forma is, ahogy azt az oper\u00e1torokn\u00e1l m\u00e1r megtanulhattad.<\/p>\n<p>Ez a hozz\u00e1f\u0171z\u00e9s azonban nem csak oper\u00e1tor szinten \u00e9rhet\u0151 el, hanem f\u00fcggv\u00e9ny szinten is. L\u00e1ssuk a k\u00f6vetkez\u0151 p\u00e9ld\u00e1t:<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [3,6]; title: ; notranslate\" title=\"\">\r\nstring s = &quot;abc&quot;;\r\ncout &lt;&lt; s &lt;&lt; endl; \/\/ abc\r\ns.append(&quot;defhg&quot;);\r\ncout &lt;&lt; s &lt;&lt; endl; \/\/ abcdefgh\r\n\r\ns.append(&quot;ij&quot;);\r\ncout &lt;&lt; s &lt;&lt; endl; \/\/ abcdefghij\r\n<\/pre>\n<p>Az eredm\u00e9ny ebben az esetben ugyanaz, mint az el\u0151bb, csak itt egy f\u00fcggv\u00e9ny oldja meg a hozz\u00e1f\u0171z\u00e9st. Nem tudom megmondani, mi \u00e9rtelme van k\u00e9tf\u00e9lek\u00e9pp megoldani a feladatot. A sebess\u00e9gm\u00e9r\u00e9sek alapj\u00e1n tal\u00e1n a += megold\u00e1s egy hajsz\u00e1lnyival gyorsabb a f\u00fcggv\u00e9nyesn\u00e9l, ami azonban az objektum orient\u00e1lt szeml\u00e9lethez \u00e1ll k\u00f6zelebb. Haszn\u00e1ld azt, amelyiket szeretn\u00e9d, de akkor haszn\u00e1ld k\u00f6vetkezetesen \u00e9s haszn\u00e1ld j\u00f3l.<\/p>\n<h4><a name=\"at\"><\/a>String adott karaktere &#8211; at(), []<\/h4>\n<p>Sokszor van arra sz\u00fcks\u00e9g, hogy egy string karaktereit megvizsg\u00e1ljuk. A string, mint ahogy eml\u00edtettem egy karakterl\u00e1nc, karakterek t\u00f6mbje. Azt is tudjuk, hogy a C++ nyelvben a string megv\u00e1ltoztathat\u00f3, vagyis a karaktereit k\u00f6zvetlen\u00fcl el\u00e9rhetem, \u00e1t\u00edrhatom. Ez arra is j\u00f3, hogy ezeken a karaktereken, mint egy t\u00f6mb\u00f6n v\u00e9gigmenjek egy ciklussal. L\u00e1ssunk k\u00e9t p\u00e9ld\u00e1t arra, hogy hogyan \u00edrhatok ki egy stringet f\u00fcgg\u0151legesen a konzolba, vagyis karakterenk\u00e9nt egym\u00e1s al\u00e1:<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [2]; title: ; notranslate\" title=\"\">\r\nstring s = &quot;abrakadabra&quot;;\r\nint meret = s.length();\r\nfor( int i = 0; i &lt; meret; i++ )\r\n{\r\n    cout &lt;&lt; s&#x5B;i] &lt;&lt; endl;\r\n}\r\n<\/pre>\n<pre class=\"brush: cpp; gutter: true; highlight: [2]; title: ; notranslate\" title=\"\">\r\nstring s = &quot;abrakadabra&quot;;\r\nint meret = s.length();\r\nfor( int i = 0; i &lt; meret; i++ )\r\n{\r\n    cout &lt;&lt; s.at(i) &lt;&lt; endl;\r\n}\r\n<\/pre>\n<p>A kiemelt sorokban valami furcsas\u00e1got l\u00e1thatsz. Err\u0151l ugyan nem besz\u00e9ltem, de az eg\u00e9sz t\u00edpusokon bel\u00fcl l\u00e9teznek olyanok, amelyek el\u0151jel n\u00e9lk\u00fcli (nem negat\u00edv) sz\u00e1mokat tartalmazhatnak. A string m\u00e9rete, a length() egy ilyen el\u0151jel n\u00e9lk\u00fcli eredm\u00e9nyt ad. Amikor azonban direk m\u00f3don a for ciklusba rakod bele a string m\u00e9ret\u00e9t lek\u00e9rdez\u0151 f\u00fcggv\u00e9nyt, akkor a ford\u00edt\u00e1skor egy figyelmeztet\u00e9st (warning) kapsz, hogy a for ciklus egy el\u0151jeles sz\u00e1mot v\u00e1rna. Ha azonban el\u0151tte egy int t\u00edpusba berakod a length() f\u00fcggv\u00e9ny eredm\u00e9ny\u00e9t, akkor a meret v\u00e1ltoz\u00f3 m\u00e1r el\u0151jeles lesz, \u00edgy a for figyelmeztet\u00e9s n\u00e9lk\u00fcl tudja haszn\u00e1lni. M\u0171k\u00f6dni a figyelmeztet\u00e9s ellen\u00e9re is m\u0171k\u00f6dik, de szerencs\u00e9sebbnek tartom, hogy figyelmeztet\u00e9s n\u00e9lk\u00fcl ezzel a kis tr\u00fckkel haszn\u00e1ld a string m\u00e9ret\u00e9t a bej\u00e1r\u00e1s\u00e1hoz.<\/p>\n<p>Vagy mi van akkor, ha egy string tartalm\u00e1t ford\u00edtva kellene ki\u00edrni?<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nstring s = &quot;abrakadabra&quot;;\r\nint meret = s.length();\r\nfor( int i = meret-1; i &gt; -1; i-- )\r\n{\r\n    cout &lt;&lt; s&#x5B;i];\r\n}\r\ncout &lt;&lt; endl;\r\n<\/pre>\n<p>Az el\u0151z\u0151 p\u00e9ld\u00e1ban term\u00e9szetesen a [] helyett a .at() f\u00fcggv\u00e9nyt is haszn\u00e1lhattam volna. Szint\u00e9n kell egy adott string karaktere akkor, ha mondjuk bizonyos karaktereket mondjuk cser\u00e9lni szeretn\u00e9nk valami m\u00e1sra.<\/p>\n<h4><a name=\"compare\"><\/a>stringek \u00f6sszehasonl\u00edt\u00e1sa &#8211; compare()<\/h4>\n<h4>stringek \u00f6sszehasonl\u00edt\u00e1sa &#8211; &gt; = &lt;<\/h4>\n<p>Enn\u00e9l a f\u00fcggv\u00e9nyn\u00e9l sokf\u00e9le haszn\u00e1lati m\u00f3d lehets\u00e9ges. L\u00e1ssuk ezeket k\u00fcl\u00f6n-k\u00fcl\u00f6n. L\u00e1ssuk el\u0151sz\u00f6r a <strong>compare()<\/strong> f\u00fcggv\u00e9nyt.<\/p>\n<p><strong>K\u00e9t string \u00f6sszehasonl\u00edt\u00e1sa &#8211; str1.compare(str2)<br \/>\n<\/strong><\/p>\n<p>Itt alapvet\u0151en azt vizsg\u00e1ljuk, hogy a k\u00e9t string egym\u00e1shoz k\u00e9pest hol helyezkedik el az abc rendnek megfelel\u0151en, amely val\u00f3j\u00e1ban az ascii k\u00f3dt\u00e1bla alapj\u00e1n dolgozik. Ebben az esetben a compare f\u00fcggv\u00e9ny egy sz\u00e1mot ad vissza, mely az egym\u00e1shoz k\u00e9pest elfoglalt poz\u00edci\u00f3jukat jelenti. Ezen haszn\u00e1lati m\u00f3d formailag \u00edgy n\u00e9z ki:<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [4,9,14,20]; title: ; notranslate\" title=\"\">\r\n\/\/ egyenl\u0151s\u00e9gvizsg\u00e1lat\r\nstring str1 = &quot;abc&quot;;\r\nstring str2 = &quot;abc&quot;;\r\ncout &lt;&lt; str1.compare(str2) &lt;&lt; endl; \/\/ 0, vagyis egyenl\u0151ek\r\n\r\n\/\/ nem-egyenl\u0151s\u00e9gvizsg\u00e1lat\r\nstr1 = &quot;abc&quot;;\r\nstr2 = &quot;abd&quot;;\r\ncout &lt;&lt; str1.compare(str2) &lt;&lt; endl; \/\/ nem 0, vagyis nem egyenl\u0151ek\r\n\r\n\/\/ poz\u00edci\u00f3 egym\u00e1shoz k\u00e9pest\r\nstr1 = &quot;abc&quot;;\r\nstr2 = &quot;abf&quot;;\r\ncout &lt;&lt; str1.compare(str2) &lt;&lt; endl; \/\/ -1, vagyis az els\u0151 kisebb\r\n                                    \/\/ el\u0151r\u00e9bb van az abc-ben\r\n\r\n\/\/ poz\u00edci\u00f3 egym\u00e1shoz k\u00e9pest\r\nstr1 = &quot;hij&quot;;\r\nstr2 = &quot;def&quot;;\r\ncout &lt;&lt; str1.compare(str2) &lt;&lt; endl; \/\/ 1, vagyis az els\u0151 nagyobb\r\n                                    \/\/ h\u00e1tr\u00e1bb van az abc-ben\r\n<\/pre>\n<p>A megjegyz\u00e9sekben szerepl\u0151 dolgok (egyenl\u0151s\u00e9g, nem egyenl\u0151s\u00e9g, stb) val\u00f3j\u00e1ban nem a haszn\u00e1latot v\u00e1ltoztatj\u00e1k meg. Ha megn\u00e9zed, akkor a vizsg\u00e1latban haszn\u00e1lt k\u00f3d minden esetben ugyanaz. A k\u00fcl\u00f6nbs\u00e9g a visszat\u00e9r\u00e9si \u00e9rt\u00e9kben van:<\/p>\n<ul>\n<li>0 &#8211; egyenl\u0151ek<\/li>\n<li>nem 0 &#8211; nem egyenl\u0151ek<\/li>\n<li>1 az els\u0151 h\u00e1tr\u00e1bb szerepel abc rendben<\/li>\n<li>-1 a m\u00e1sodik h\u00e1tr\u00e1bb szerepel abc rendben<\/li>\n<\/ul>\n<p>A m\u00e1sodik eset, amikor a visszat\u00e9r\u00e9si \u00e9rt\u00e9k nem 0, az azt jelenti, hogy a k\u00e9t string nem egyenl\u0151. Azt nem tudjuk melyik a &#8220;nagyobb&#8221;, csak azt, hogy nem egyenl\u0151ek. Az utols\u00f3 k\u00e9t eset pedig ezt a nem egyenl\u0151s\u00e9get bontja kett\u00e9. Az el\u0151r\u00e9bb \u00e9s h\u00e1tr\u00e1bb van az abc-ben egy kicsit pongyola megfogalmaz\u00e1s. Val\u00f3j\u00e1ban arr\u00f3l van sz\u00f3, hogy az ASCII k\u00f3dt\u00e1bl\u00e1ban elfoglalt hely\u00fck alapj\u00e1n d\u00f6nti ez a f\u00fcggv\u00e9ny, hogy melyik string el\u0151zi meg a m\u00e1sikat. A k\u00f3dt\u00e1bl\u00e1ban a nagybet\u0171k megel\u0151zik a kisbet\u0171ket! Ha a stringek eleje megegyezik, akkor megkeresi az els\u0151 k\u00fcl\u00f6nb\u00f6z\u0151 karaktert \u00e9s aszerint d\u00f6nti el, hogy melyik string szerepel a m\u00e1sik el\u0151tt, \u00e9s annak megfelel\u0151 v\u00e9geredm\u00e9nyt ad (l\u00e1sd 3. p\u00e9lda).<\/p>\n<p>Mi a helyzet akkor, ha a k\u00e9t string nem egyforma m\u00e9ret\u0171, de a r\u00f6videbb string ugyanaz, mint a hosszabb string eleje? L\u00e1ssuk az al\u00e1bbi p\u00e9ld\u00e1t:<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [4]; title: ; notranslate\" title=\"\">\r\n\/\/ poz\u00edci\u00f3 egym\u00e1shoz k\u00e9pest nem azonos m\u00e9rettel\r\nstr1 = &quot;abc&quot;;\r\nstr2 = &quot;abcd&quot;;\r\ncout &lt;&lt; str1.compare(str2) &lt;&lt; endl; \/\/ -1, vagyis az els\u0151 kisebb\r\n                                    \/\/ el\u0151r\u00e9bb van az abc-ben\r\n<\/pre>\n<p>\u00c9s ha a k\u00e9t string sz\u00f6veg szerint egyforma, de kis-nagybet\u0171 k\u00fcl\u00f6nbs\u00e9g van?<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [4]; title: ; notranslate\" title=\"\">\r\n\/\/ poz\u00edci\u00f3 egym\u00e1shoz k\u00e9pest nem azonos m\u00e9rettel\r\nstr1 = &quot;abc&quot;;\r\nstr2 = &quot;Abc&quot;;\r\ncout &lt;&lt; str1.compare(str2) &lt;&lt; endl; \/\/ 1, vagyis az els\u0151 nagyobb\r\n                                    \/\/ h\u00e1tr\u00e1bb van az abc-ben\r\n<\/pre>\n<p><strong>string r\u00e9sz\u00e9nek \u00f6sszehasonl\u00edt\u00e1sa m\u00e1sik string-gel &#8211; str1.compare(honnan,meddig,mivel)<\/strong><\/p>\n<p>Ebben az esetben azt tudjuk megvizsg\u00e1lni, hogy a string egy r\u00e9sze megegyezik-e valamilyen mint\u00e1val. L\u00e1ssunk r\u00e1 egy p\u00e9ld\u00e1t:<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [3]; title: ; notranslate\" title=\"\">\r\nstring str = &quot;sargadinnye&quot;;\r\n\r\nif( str.compare( 5, 6, &quot;dinnye&quot; ) == 0 )\r\n{\r\n    cout &lt;&lt; &quot;A sargadinnye egy dinnyefajta.&quot; &lt;&lt; endl;\r\n}\r\n<\/pre>\n<p>Ebben a p\u00e9ld\u00e1ban annyi t\u00f6rt\u00e9nik, hogy megvizsg\u00e1ljuk az str-ben megadott stringben, hogy az 5-\u00f6s karaktert\u0151l kezd\u0151d\u0151 6 hossz\u00fa szakasz \u00f6sszehasonl\u00edtva a &#8220;dinnye&#8221; sz\u00f3val milyen eredm\u00e9nyt ad. Ha az eredm\u00e9ny 0, az azt jelenti, hogy az str-ben megadott string r\u00e9sze megegyezik a megadott mint\u00e1val. A -1 \u00e9s 1 visszat\u00e9r\u00e9si \u00e9rt\u00e9kek szint\u00e9n az abc rendben egym\u00e1shoz viszony\u00edtott elt\u00e9r\u00e9st jelentik.<\/p>\n<p><strong>k\u00e9t string adott r\u00e9sz\u00e9nek \u00f6sszehasonl\u00edt\u00e1sa- str1.compare(honnan,meddig,mivel,honnan,meddig)<\/strong><\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [4]; title: ; notranslate\" title=\"\">\r\nstr1 = &quot;granatalma&quot;;\r\nstr2 = &quot;zoldalma&quot;;\r\n\r\nif( str1.compare(str1.length()-4,4,str2,str2.length()-4,4) == 0 )\r\n{\r\n    cout &lt;&lt; &quot;Mindket szo vegen alma szo van.&quot; &lt;&lt; endl;\r\n}\r\n<\/pre>\n<p>A fenti p\u00e9ld\u00e1ban azt vizsg\u00e1lom meg, hogy mindk\u00e9t sz\u00f3 v\u00e9g\u00e9n ugyanaz r\u00e9szlet szerepel-e. Ebben a p\u00e9d\u00e1ban kihaszn\u00e1lom azt, hogy mindk\u00e9t sz\u00f3 v\u00e9g\u00e9n egy 4 bet\u0171s r\u00e9szletet keresek, ez\u00e9rt a honnan param\u00e9tern\u00e9l a string hossz\u00e1b\u00f3l kivonom a keresett r\u00e9szlet hossz\u00e1t, \u00edgy mindenk\u00e9pp a sz\u00f3 v\u00e9g\u00e9n keresem a 4 hossz\u00fa r\u00e9szletet.<\/p>\n<p>J\u00f6jj\u00f6n a <strong>rel\u00e1ci\u00f3s jeles \u00f6sszehasonl\u00edt\u00e1s<\/strong>:<\/p>\n<p>Az el\u0151z\u0151h\u00f6z hasonl\u00f3an itt is \u00f6sszehasonl\u00edtunk, de itt a rel\u00e1ci\u00f3s jeleket haszn\u00e1ljuk, a v\u00e1lasz pedig minden esetben egy logikai \u00e9rt\u00e9k.<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [4,9,14,19,25,31,37,42]; title: ; notranslate\" title=\"\">\r\n\/\/ egyenl\u0151s\u00e9gvizsg\u00e1lat\r\nstring str1 = &quot;abc&quot;;\r\nstring str2 = &quot;abc&quot;;\r\ncout &lt;&lt; (str1 == str2) &lt;&lt; endl; \/\/ 1 (igaz), vagyis egyenl\u0151ek\r\n\r\n\/\/ egyenl\u0151s\u00e9gvizsg\u00e1lat\r\nstr1 = &quot;abc&quot;;\r\nstr2 = &quot;Abc&quot;;\r\ncout &lt;&lt; (str1 == str2) &lt;&lt; endl; \/\/ 0 (hamis), vagyis nem egyenl\u0151ek\r\n\r\n\/\/ nem-egyenl\u0151s\u00e9gvizsg\u00e1lat\r\nstr1 = &quot;abc&quot;;\r\nstr2 = &quot;abd&quot;;\r\ncout &lt;&lt; (str1 != str2) &lt;&lt; endl; \/\/ 1 (igaz), vagyis nem egyenl\u0151ek\r\n\r\n\/\/ poz\u00edci\u00f3 egym\u00e1shoz k\u00e9pest\r\nstr1 = &quot;abc&quot;;\r\nstr2 = &quot;abf&quot;;\r\ncout &lt;&lt; (str1 &lt; str2) &lt;&lt; endl; \/\/ 1 (igaz), vagyis az els\u0151 kisebb\r\n                               \/\/ el\u0151r\u00e9bb van az abc-ben\r\n\r\n\/\/ poz\u00edci\u00f3 egym\u00e1shoz k\u00e9pest azonos m\u00e9rettel\r\nstr1 = &quot;hij&quot;;\r\nstr2 = &quot;def&quot;;\r\ncout &lt;&lt; (str1 &gt; str2) &lt;&lt; endl; \/\/ 1 (igaz), vagyis a m\u00e1sodik kisebb\r\n                               \/\/ el\u0151r\u00e9bb van az abc-ben\r\n\r\n\/\/ poz\u00edci\u00f3 egym\u00e1shoz k\u00e9pest nem azonos m\u00e9rettel\r\nstr1 = &quot;abc&quot;;\r\nstr2 = &quot;abcd&quot;;\r\ncout &lt;&lt; (str1 &lt; str2) &lt;&lt; endl; \/\/ 1 (igaz), vagyis a m\u00e1sodik nagyobb\r\n                               \/\/ h\u00e1tr\u00e1bb van az abc-ben\r\n\r\n\/\/ egyenl\u0151s\u00e9g vizsg\u00e1lat sz\u00f6vegben azonos, kis-nagybet\u0171 k\u00fcl\u00f6nbs\u00e9ggel\r\nstr1 = &quot;abc&quot;;\r\nstr2 = &quot;Abc&quot;;\r\ncout &lt;&lt; (str1 == str2) &lt;&lt; endl; \/\/ 0 (hamis), vagyis nem egyenl\u0151ek\r\n\r\n\/\/ poz\u00edci\u00f3 egym\u00e1shoz k\u00e9pest\r\nstr1 = &quot;klm&quot;;\r\nstr2 = &quot;def&quot;;\r\ncout &lt;&lt; (str1 &lt; str2) &lt;&lt; endl; \/\/ 0 (hamis), de nem tudjuk, mi a helyzet\r\n<\/pre>\n<p>Az utols\u00f3 feladattal gond van. Ism\u00e9t felh\u00edvn\u00e1m a figyelmet: rel\u00e1ci\u00f3s jeles \u00f6sszehasonl\u00edt\u00e1sn\u00e1l az eredm\u00e9ny igaz vagy hamis. De \u00f6sszehasonl\u00edt\u00e1sn\u00e1l alapvet\u0151en 3 eset lehets\u00e9ges: egyenl\u0151ek, az els\u0151 nagyobb, a m\u00e1sodik nagyobb. Az utols\u00f3 feladatn\u00e1l csak annyit tudunk a hamis eredm\u00e9nyb\u0151l, hogy az els\u0151 biztosan nem kisebb (el\u0151r\u00e9bb), de att\u00f3l m\u00e9g lehet egyenl\u0151, vagy nagyobb (h\u00e1tr\u00e1bb) is. Ezt viszont egy vizsg\u00e1latb\u00f3l nem tudjuk eld\u00f6nteni.<\/p>\n<p>Amikor azonban igaz \u00e9rt\u00e9ket kapunk v\u00e1laszk\u00e9nt egy &gt; vagy &lt; rel\u00e1ci\u00f3jeles \u00f6sszehasonl\u00edt\u00e1sra, akkor ott egy\u00e9rtelm\u0171, hogy melyik a nagyobb vagy kisebb.<\/p>\n<h4><a name=\"insert\"><\/a>Besz\u00far\u00e1s string-be &#8211; insert()<\/h4>\n<p>Sz\u00f6vegkezel\u00e9si feladatainkn\u00e1l sokszor el\u0151fordul, hogy egy l\u00e9tez\u0151 sz\u00f6vegbe kell besz\u00farnunk egy \u00faj r\u00e9szletet. Ennek is sokf\u00e9le felhaszn\u00e1l\u00e1si m\u00f3dja van, \u00e9n csak a legfontosabbakat eml\u00edten\u00e9m meg.<\/p>\n<p><strong>Besz\u00far\u00e1s adott poz\u00edci\u00f3hoz- str.insert(hova,mit)<\/strong><\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [2]; title: ; notranslate\" title=\"\">\r\nstring str = &quot;alma&quot;;\r\nstr.insert(0,&quot;granat&quot;);\r\ncout &lt;&lt; str &lt;&lt; endl; \/\/ granatalma\r\n<\/pre>\n<p>Ebben az esetben megadjuk, hogy pontosan hova szeretn\u00e9nk beilleszteni a k\u00edv\u00e1nt darabot. Ha a poz\u00edci\u00f3 0, akkor az \u00e9rtelemszer\u0171en a string eleje lesz. Term\u00e9szetesen b\u00e1rhova besz\u00farhatunk, l\u00e1sd a k\u00f6vetkez\u0151 p\u00e9ld\u00e1t:<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [2]; title: ; notranslate\" title=\"\">\r\nstring str = &quot;acelmu&quot;;\r\nstr.insert(4,&quot;henger&quot;);\r\ncout &lt;&lt; str &lt;&lt; endl;\r\n<\/pre>\n<p>A besz\u00far\u00e1s az eredeti tartalomb\u00f3l nem t\u00f6r\u00f6l, hanem kib\u0151v\u00edti. \u00c9s mi van akkor, ha a v\u00e9g\u00e9re szeretn\u00e9nk besz\u00farni? Akkor nyilv\u00e1n haszn\u00e1lhatjuk a hozz\u00e1f\u0171z\u00e9sn\u00e9l tanultakat, vagy ak\u00e1r ezt is:<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [2]; title: ; notranslate\" title=\"\">\r\nstring str = &quot;adat&quot;;\r\nstr.insert(str.length(),&quot;bazis&quot;);\r\ncout &lt;&lt; str &lt;&lt; endl;\r\n<\/pre>\n<h4><a name=\"erase\"><\/a>String r\u00e9sz\u00e9nek t\u00f6rl\u00e9se &#8211; erase()<\/h4>\n<p>T\u00f6bbsz\u00f6r el\u0151fordul az, hogy egy string r\u00e9sz\u00e9t t\u00f6r\u00f6lni szeretn\u00e9nk. \u00c9ppen meg lehetne oldani \u00fagy is, hogy egy m\u00e1sik stringbe \u00e1trakjuk a megmarad\u00f3 r\u00e9szeket, kihagyva a t\u00f6rlend\u0151 r\u00e9szt, de ett\u0151l a t\u00e9nyleges t\u00f6rl\u00e9s az\u00e9rt j\u00f3val egyszer\u0171bb. T\u00f6r\u00f6lni tudunk egyetlen karaktert is, vagy egy adott r\u00e9szt. L\u00e1ssuk akkor, hogyan lehet ezt megtenni.<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [4,7,10]; title: ; notranslate\" title=\"\">\r\nstring str = &quot;adatbazis-kezeles&quot;;\r\ncout &lt;&lt; str &lt;&lt; endl; \/\/ adatbazis-kezeles\r\n\r\nstr.erase(4,5);      \/\/ adatbazis-kezeles\r\ncout &lt;&lt; str &lt;&lt; endl; \/\/     ^^^^^\r\n\r\nstr.erase(4,1);      \/\/ adat-kezeles\r\ncout &lt;&lt; str &lt;&lt; endl; \/\/     ^\r\n\r\nstr.erase(4);        \/\/ adatkezeles\r\ncout &lt;&lt; str &lt;&lt; endl; \/\/     ^^^^^^^\r\n<\/pre>\n<h4><a name=\"substr\"><\/a>string r\u00e9sz\u00e9nek kinyer\u00e9se &#8211; substr()<\/h4>\n<p>El\u0151fordulhat, hogy egy stringb\u0151l ki kell szedn\u00fcnk egy kisebb r\u00e9szletet. Erre szolg\u00e1l a substr() f\u00fcggv\u00e9ny.<\/p>\n<p>Amikor egy r\u00e9szt akarunk kinyerni egy stringb\u0151l, akkor meg kell mondanunk, hogy milyen karaktert\u0151l kezd\u0151d\u0151en akarom ezt megkapni, valamint hogy ett\u0151l a pontt\u00f3l kezdve h\u00e1ny darabot. <strong>Melyikt\u0151l<\/strong> kezdj\u00fck, \u00e9s <strong>mennyi<\/strong> karakter kell. Ha csak a kezd\u0151 poz\u00edci\u00f3t adjuk meg, akkor onnant\u00f3l a string v\u00e9g\u00e9ig az eg\u00e9szet megkapjuk. A substr() mindig string t\u00edpus\u00fa eredm\u00e9nyt ad vissza.<\/p>\n<pre class=\"brush: cpp; title: ; notranslate\" title=\"\">\r\nstring s = &quot;abrakadabra&quot;;\r\ncout &lt;&lt; s.substr(0,5) &lt;&lt; endl; \/\/ abrak\r\ncout &lt;&lt; s.substr(2,3) &lt;&lt; endl; \/\/ rak\r\ncout &lt;&lt; s.substr(5,3) &lt;&lt; endl; \/\/ ada\r\ncout &lt;&lt; s.substr(6) &lt;&lt; endl;   \/\/ dabra\r\ncout &lt;&lt; s.substr(s.length()) &lt;&lt; endl; \/\/ mindig \u00fcres string\r\n<\/pre>\n<h4><a name=\"replace\"><\/a>String adott r\u00e9sz\u00e9nek cser\u00e9je &#8211; replace()<\/h4>\n<p>Ha a feladat \u00fagy k\u00edv\u00e1nja, lehet\u0151s\u00e9g\u00fcnk van a string bizonyos r\u00e9szeinek cser\u00e9j\u00e9re. Term\u00e9szetesen ez is megoldhat\u00f3 lenne, hogy az adott r\u00e9szt t\u00f6r\u00f6lj\u00fck, majd besz\u00farjuk oda a kiv\u00e1nt r\u00e9szt, de ett\u0151l term\u00e9szetesen van egyszer\u0171bb lehet\u0151s\u00e9g is. A csere nem csak azonos m\u00e9ret\u0171 r\u00e9szek eset\u00e9n m\u0171k\u00f6dik, egy kisebb r\u00e9szt cser\u00e9lhetsz nagyobbra is, akkor a string m\u00e9rete megn\u0151. Fontos azonban tudni, hogy a csere nem sz\u00f6veg r\u00e9szleteket keres, hanem a poz\u00edci\u00f3kat kell megadni, hogy mett\u0151l-meddig cser\u00e9lsz, nem \u00fagy, hogy mit cser\u00e9lsz \u00e9s mire. A replace f\u00fcggv\u00e9nynek sokf\u00e9le haszn\u00e1lati m\u00f3dja l\u00e9tezik, \u00e9n most csak a legfontosabbakat mutatom be p\u00e9ld\u00e1kon kereszt\u00fcl.<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [4,7,10]; title: ; notranslate\" title=\"\">\r\nstring str = &quot;Ez egy nagyon hosszu mondat.&quot;;\r\ncout &lt;&lt; str &lt;&lt; endl;       \/\/ Ez egy nagyon hosszu mondat.\r\n\r\nstr.replace(7,13,&quot;rovid&quot;); \/\/ Ez egy rovid mondat.\r\ncout &lt;&lt; str &lt;&lt; endl;\r\n\r\nstr.replace(7,6,&quot;&quot;);      \/\/ Ez egy mondat.\r\ncout &lt;&lt; str &lt;&lt; endl;      \/\/ ak\u00e1r t\u00f6rl\u00e9sre is...\r\n\r\nstr.replace(13,1,&quot;?&quot;);    \/\/ Ez egy mondat?\r\ncout &lt;&lt; str &lt;&lt; endl;\r\n\r\nstr.replace(3,3,&quot;kerdo&quot;); \/\/ Ez kerdo mondat?\r\ncout &lt;&lt; str &lt;&lt; endl;\r\n<\/pre>\n<h4><a name=\"find\"><\/a>Keres\u00e9s string-ben &#8211; find(), rfind(), find_first_of(), find_last_of(), find_first_not_of(), find_last_not_of()<\/h4>\n<p>Mi van akkor, ha valamilyen okb\u00f3l tudni szeretn\u00e9nk, hogy az adott string-ben el\u0151fordul-e valamilyen r\u00e9szlet, \u00e9s ha benne van, azt is tudni szeretn\u00e9nk, hogy pontosan hol. Ennek t\u00f6bb oka is lehet. Szeretn\u00e9nk oda besz\u00farni valamit, ki szeretn\u00e9nk t\u00f6r\u00f6lni a megtal\u00e1lt r\u00e9szt, esetleg ki szeretn\u00e9nk cser\u00e9lni valami m\u00e1sra. \u00d6nmag\u00e1ban a keres\u00e9s is el\u0151fordulhat persze, de legt\u00f6bbsz\u00f6r kombin\u00e1ljuk valami m\u00e1s m\u0171velettel. A keres\u00e9s minden esetben a keresett r\u00e9sz poz\u00edci\u00f3j\u00e1t adja meg. Ha mondjuk az eredm\u00e9ny 0, akkor az azt jelenti, hogy a string elej\u00e9n tal\u00e1ltuk meg. Azt l\u00e1thatod, hogy t\u00f6bb keres\u0151 f\u00fcggv\u00e9nyt is fel\u00edrtam. L\u00e1ssuk akkor sorban, el\u0151sz\u00f6r felsorol\u00e1s jelleggel, hogy melyik mit is csin\u00e1l.<\/p>\n<ul>\n<li>find &#8211; megkeresi az adott r\u00e9sz els\u0151 el\u0151fordul\u00e1s\u00e1nak kezdet\u00e9t<\/li>\n<li>rfind &#8211; megkeresi az adott r\u00e9sz utols\u00f3 el\u0151fordul\u00e1s\u00e1nak kezdet\u00e9t<\/li>\n<li>find_first_of &#8211; megkeresi a felsorolt karakterek k\u00f6z\u00fcl az els\u0151 el\u0151fordul\u00e1s\u00e1t<\/li>\n<li>find_last_of &#8211; megkeresi a felsorolt karakterek k\u00f6z\u00fcl az utols\u00f3 el\u0151fordul\u00e1s\u00e1t<\/li>\n<li>find_first_not_of &#8211; megkeresi az els\u0151 nem felsorolt karaktert<\/li>\n<li>find_last_not_of &#8211; megkeresi az utols\u00f3 nem felsorolt karaktert<\/li>\n<\/ul>\n<pre class=\"brush: cpp; gutter: true; highlight: [9]; title: ; notranslate\" title=\"\">\r\nstring s = &quot;abrakadabra&quot;;\r\ncout &lt;&lt; s &lt;&lt; endl;\r\ncout &lt;&lt; s.find(&quot;br&quot;) &lt;&lt; endl;               \/\/ 1\r\ncout &lt;&lt; s.rfind(&quot;br&quot;) &lt;&lt; endl;              \/\/ 8\r\ncout &lt;&lt; s.find_first_of(&quot;kd&quot;) &lt;&lt; endl;      \/\/ 4\r\ncout &lt;&lt; s.find_last_of(&quot;bd&quot;) &lt;&lt; endl;       \/\/ 8\r\ncout &lt;&lt; s.find_first_not_of(&quot;abr&quot;) &lt;&lt; endl; \/\/ 4\r\ncout &lt;&lt; s.find_last_not_of(&quot;bra&quot;) &lt;&lt; endl;  \/\/ 6\r\ncout &lt;&lt; s.find(&quot;bela&quot;) &lt;&lt; endl;             \/\/ 4294967295 ?\r\n<\/pre>\n<p>Tal\u00e1n az utols\u00f3 szorul csak magyar\u00e1zatra. Amikor nem tal\u00e1lja meg benne a keresett string-et, akkor egy meglehet\u0151sen furcsa \u00e9rt\u00e9ket kapunk. Ha megn\u00e9zz\u00fck a p\u00e9ld\u00e1t, l\u00e1thatjuk, hogy a &#8220;bela&#8221; sz\u00f6vegr\u00e9sz nem tal\u00e1lhat\u00f3 meg az eredeti string-ben. J\u00f3l sejtheted, hogy ezzel lehet kapcsolatban a dolog.<\/p>\n<p>A string, ahogy fent eml\u00edtettem, karakterek t\u00f6mbje. A kapott eredm\u00e9ny a legnagyobb l\u00e9trehozhat\u00f3 string m\u00e9rete. A string karaktereinek indexel\u00e9se ugyan\u00fagy 0 \u00e9rt\u00e9kkel kezd\u0151dik, mint a t\u00f6mb\u00f6kn\u00e9l, vagyis az eredm\u00e9ny, mint m\u00e9ret, soha nem lehet val\u00f3di index. Hasonl\u00f3an, mint a t\u00f6mb\u00f6kn\u00e9l: a t\u00f6mb m\u00e9rete nem lehet index.<\/p>\n<p>A string-nek van egy npos nev\u0171 adata, amit kiolvashatunk bel\u0151le. Az npos pontosan azt az \u00e9rt\u00e9ket jelenti, hogy mekkora lehet a legnagyobb l\u00e9trehozhat\u00f3 string, vagyis ez indexk\u00e9nt soha nem fordulhat el\u0151. Ha egy keres\u00e9s eredm\u00e9nye az npos-ban t\u00e1rolt sz\u00e1mmal egyenl\u0151, akkor a keresett r\u00e9sz nem tal\u00e1lhat\u00f3 meg a string-ben, ha nem egyenl\u0151 az npos \u00e9rt\u00e9k\u00e9vel, akkor megtal\u00e1lhat\u00f3 benne.<\/p>\n<pre class=\"brush: cpp; gutter: true; highlight: [4,7,10]; title: ; notranslate\" title=\"\">\r\nstring s = &quot;abrakadabra&quot;;\r\nif( s.find(&quot;zabra&quot;) != s.npos )\r\n{\r\n    cout &lt;&lt; &quot;A zabra resz megtalalhato a string-ben.&quot; &lt;&lt; endl;\r\n}\r\nelse\r\n{\r\n    cout &lt;&lt; &quot;A zabra resz NEM talalhato meg a string-ben.&quot; &lt;&lt; endl;\r\n}\r\n<\/pre>\n<p>Eljutott\u00e1l az alap leck\u00e9k v\u00e9g\u00e9re. Ha j\u00f3l dolgozt\u00e1l, akkor az ezekben tal\u00e1lhat\u00f3 tananyagot megfelel\u0151en alkalmazni is tudod. J\u00f6jjenek akkor a halad\u00f3 leck\u00e9k.<\/p>\n<h4>K\u00f6vetkez\u0151 lecke: <a href=\"http:\/\/www.webotlet.hu\/?p=1997\">Saj\u00e1t f\u00fcggv\u00e9nyek<\/a><\/h4>\n","protected":false},"excerpt":{"rendered":"<p>String, avagy minden, amit beg\u00e9pelhetsz (vagy nem) M\u00e9g nincs ellen\u0151rizve, de felteszem, csak hogy haladni lehessen. A C++ programoz\u00e1si nyelvben, mint megtudhattad, t\u00f6bbf\u00e9le v\u00e1ltoz\u00f3t\u00edpus l\u00e9tezik. Ezek egy r\u00e9sze egyszer\u0171 (primit\u00edv) t\u00edpus, de vannak \u00f6sszetett, komplexebb t\u00edpusok. Ezek egyike a karakterl\u00e1nc, <a class=\"more-link\" href=\"https:\/\/www.webotlet.hu\/?p=1841\">Tov\u00e1bb <span class=\"screen-reader-text\">  C++ programoz\u00e1s 16. &#8211; String<\/span><span class=\"meta-nav\">&rarr;<\/span><\/a><\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[151],"tags":[158,159,60,165,143,29],"class_list":["post-1841","post","type-post","status-publish","format-standard","hentry","category-cplusplus-alap-leckek","tag-c","tag-c-programozas","tag-karakterlanc","tag-karaktertomb","tag-programozas","tag-string"],"_links":{"self":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/1841","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=1841"}],"version-history":[{"count":61,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/1841\/revisions"}],"predecessor-version":[{"id":3187,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=\/wp\/v2\/posts\/1841\/revisions\/3187"}],"wp:attachment":[{"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=1841"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=1841"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.webotlet.hu\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=1841"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}