HIK Elektronikus Felsőoktatási Tankönyv- és Szakkönyvtár
A Kempelen Farkas Felsőoktatási Digitális Tankönyvtár/vagy más megjelenítő által közvetített digitális tartalmat a felhasználó a szerzői jogról szóló 1999. évi LXXVI. tv. 33. paragrafus (4) bekezdésében meghatározott oktatási, illetve tudományos kutatási célra használhatja fel. A felhasználó a digitális tartalmat képernyőn megjelenítheti, letöltheti, arról elektronikus adathordozóra vagy papíralapon másolatot készíthet, adatrögzítő rendszerében tárolhatja. A Kempelen Farkas Felsőoktatási Digitális Tankönyvtár/vagy más megjelenítő weblapján található digitális tartalmak üzletszerû felhasználása tilos, valamint kizárt a digitális tartalom módosítása és átdolgozása, illetve az ilyen módon keletkezett származékos anyag további felhasználása.

11.1. A string típusú változó

A C#-ban, mint minden magas szintű nyelvben létezik a string típus. Az OOP nyelvekben a string-ekre osztályként tekinthetünk, mivel vannak metódusaik, tulajdonságaik, és minden olyan paraméterük, mely a többi osztálynak, de dolgozni úgy tudunk velük, mint az összes többi programozási nyelv string típusával. Hasonlóan a többi változóhoz, a string-eket is deklarálni kell.

string s;

string w;

Adhatunk nekik értéket:

string a = "hello";

string b = "h";

b += "ello";

s="A2347";

s="1234567890";

Kiolvashatjuk, vagy éppen a képernyőre írhatjuk a bennük tárolt adatokat:

string w=s;

Console.WriteLine(s);

Figyeljük meg, hogy a fent szereplő értékadásban (s="1234567890") számok sorozatát adtuk értékül az s string típusnak. Az s változóban szereplő értékkel ebben az esetben nem számolhatunk, mert az nem numerikus értékként tárolódik, hanem ún.: karakterlánc- literálként, így nem értelmezhetőek rá a numerikus típusoknál használt operátorok.

Igaz, hogy a + művelet értelmezhető a string-ekre is, de működése eltér a számoknál megszokottól. (A fejezet későbbi témáinál kitérünk a + operátor működésére.)

Fontos megemlíteni, hogy a C alapú nyelvekben a \ (backslash) karakter ún.: escape szekvencia. Az s="C:\hello" karakter sorozat hibás eredményt szolgáltat, ha elérési útként szeretnénk felhasználni, mivel a \h -nak nincs jelentése, viszont a rendszer megpróbálja értelmezni. Ilyen esetekben vagy s="C:\\hello" vagy s=@"C:\hello" formulát használjuk! Az első megoldásban az első \ jel elnyomja a második \ jel hatását. A második megoldásnál a @ jel gondoskodik arról, hogy az utána írt string a "C:\hello" formában megmaradjon az értékadásnál, vagy a kiíró utasításokban.

Ha egy string-nek nem adunk értéket, akkor induláskor ’null’ értéke van.

Az üres string-et vagy s=""; formában, vagy s=String.Empty formában jelezhetjük.

A relációk használata kisebb megkötésekkel a string-eknél is megengedett. Az összehasonlításokat elvégezhetjük logikai kifejezésekben, elágazások és logikai ciklusok feltétel részében. A string-ek egyes elemeit tudjuk <, vagy > relációba hozni egymással s[1]<s[2], a teljes sring-re viszont csak a != és a == relációkat alkalmazhatjuk. Ha mégis szeretnénk összehasonlítani két string-et, a következő megoldást használhatjuk:

Str1.CompareTo(str2)

Ezzel a metódussal össze tudjuk hasonlítani két string értékét. A következő példa ezt be is mutatja:

int cmp;

string str1="abc";

string str2="cde";

cmp="szoveg".CompareTo("szoveg");

if ( cmp == 0) {Console.WriteLine("str1 = str2");}

if ( cmp > 0) {Console.WriteLine("str1 < str2");}

if ( cmp < 0) {Console.WriteLine("str1 > str2");}

A két string egynősége esetén a visszatérési érték 0. Ha a kapott érték kisseb, mint 0, akkor az str1 ABC sorrendben előbb van az str2 -nél, ha nagyobb, mint 0, akkor str2 van előbb. A példában a második if feltétele teljesül, mivel az abc karaktersor előbb szerepel a sorrendben, mint a cde.

A strig-eket is használhatjuk konstansként. Ugyanúgy definiáljuk őket, mint a többi típus állandóit.

const string="string konstans";

Ahogy azt már említettük, C# nyelvben a string-ek is rendelkeznek metódusokkal, mint bármely más osztály. Ez némiképp megkönnyíti a használatukat, mert nem a programozónak kell gondoskodnia pl.: a szóközök eltávolításáról, a kis és nagybetűs átalakításról, a keresés metódusainak definiálásáról, és nem kell külső rutinokhoz folyamodnia, mint a Pascal nyelv pos(), vagy copy() eljárásainál.

Az Objektum Orientált megközelítés előnyei jól nyomon követhetőek a string típus esetében. Az egységbezárás lehetővé teszi, hogy rendelkezzen saját metódusokkal. A következő példaprogram bemutatja a string-ek használatának néhány lehetőségét.

using System;

namespace String_01

{

class Class1

{

[STAThread]

static void Main(string[] args)

{

string s;

s="alma";

Console.WriteLine("{0} - A string elejéről levágtuk az

a karaktereket.",s.TrimStart('a'));

Console.WriteLine("{0} - A string végéről levágtuk az a

karaktereket.",s.TrimEnd('a'));

Console.WriteLine("{0} - Nagybetűssé alakítottuk a

sztringet.",s.ToUpper());

Console.WriteLine("{0} - Kisbetűssé alakítottuk a

sztringet.",s.ToLower());

Console.ReadLine();

}

}

}

A program futása a következő:

Az első WriteLine- ban az s string TrimStart() metódusát használtuk, mely eltávolítja a szöveg elejéről a paraméter listájában megadott karakter összes előfordulását. (Az aaalma string- ből az lma stringet állítja elő.)

A TrimStart(), TrimEnd() és a Trim() metódusuk paraméterek nélkül a string elejéről és végéről levágják a szóközöket.

A következő metódus a TrimEnd(). Ez a string végéről vágja el a megadott karaktereket.

A ToUpper() és a ToLower() metódusokkal a kis- és nagybetűs átalakításról gondoskodhatunk.

Vegyük észre, hogy az s=”alma” utasításnál a string-et macskakörmök (”…”) közé tettük, míg a TrimStart() és TrimEnd() metódusok paramétereit aposztrófok (’…’) zárják közre, mivel az első esetben string-et, a másodikban karaktert definiáltunk. Gyakori hiba, hogy a kettőt felcseréljük. Ilyenkor a fordító hibát jelez, mivel a karakterek nem kezelhetőek stringként és fordítva.

A string-ből kimásolhatunk részeket a Substring() metódussal, melynek paraméter listájában meg kell adni a kezdő indexet, ahonnan kezdjük a másolást, és a másolandó karakterek számát. A következő példa megmutatja a Substring() használatát.

Console.WriteLine("Az eredeti szó= alma, a kiemelt részlet ={0} ",s.Substring(1,2));

Ha a Substring() csak egy paramétert kap és a paraméter értéke belül van a string index tartományán, akkor az adott indextől a string végéig az összes karaktert kimásoljuk. A paraméterezéskor ügyeljünk arra, hogy mindig csak akkora indexet adjunk meg, ahány eleme van a string-nek. Arra is figyelni kell, hogy a string első eleme a 0. indexű elem, az utolsó pedig a karakeszám-1.

A stringek-re a + műveletet is értelmezhető, de ilyenkor öszefűzésről beszélünk. Amennyiben a fenti példában szereplő s stringek közé a + operátort írjuk, akkor:

s=”alma”

s=s+” a fa alatt”;

az s tartalma megváltozik, kiegészül a + jel után írt sring- konstanssal. Az eredmény: ”alma a fa alatt”. Amennyiben a fenti értékadásban szereplő változót és konstanst felcseréljük, s=”a fa alatt”+s, eredményül az ” a fa alattalma” karaktersort kapjuk. Ez azt jelenti, hogy az adott string-hez jobbról és balról is hozzáfűzhetünk más string-eket.

A keresés művelete is szerepel a metódusok között. Az IndexOf() függvény -1 értéket ad vissza, ha a paraméter listájában megadott karakter, vagy karaktersorozat nem szerepel a string- ben, 0, vagypozitív értéket, ha szerepel. Mivel a stringek 0- tól vannak indexelve, találat esetén 0-tól a string hosszáig kaphatunk visszatérési értéket, ami a találat helyét, vagyis a kezdő indexét jelenti a keresett karakternek, vagy karakterláncnak.

A következő példa bemutatja, hogyan használhatjuk az IndexOf() metódust. A program beolvas egy tetszőleges mondatot és az abban keresendő szót. Amennyiben a szó szerepel a mondatban, a képernyőre írja a mondatot, a szót és azt, hogy a szó szerepel-e vagy sem a mondatban. A C# nyelv kis-nagybetű érzékeny (case-sensitive), ezért a vizsgálat előtt a beolvasott adatokat nagybetűssé alakítjuk, hogy a tényleges tartalom alapján döntsünk.

namespace string_02

{

class Class1

{

[STAThread]

static void Main(string[] args)

{

string s;

string w;

Console.WriteLine("Gépeljen be egy tetszőleges mondatot

: ");

s=Console.ReadLine();

Console.WriteLine("Adja meg a keresendő szót : ");

w=Console.ReadLine();

s=s.ToUpper();

w=w.ToUpper();

if (s.IndexOf(w)>-1)

{

Console.WriteLine("A(z) {0} szó szerepel a(z) {1}

mondatban",w,s);

}

else

{

Console.WriteLine("A(z) {0} szó nem a(z) {1}

mondatban");

}

Console.ReadLine();

}

}

}

A program futásának eredménye:

A programunk megfelelően működik, de az Output-ja nem tökéletes, mivel az eredeti mondatot nagybetűsre alakítja, majd ezt a formáját írja vissza a képernyőre, a felhasználó által begépelt kis- nagy betűket vegyesen tartalmazó forma helyett.

A problémára több megoldás is létezik. Az egyik, hogy az eredeti változókat megőrizzük, azok tartalmát segédváltozókban tároljuk, amiket átalakíthatunk nagybetűssé, műveleteket végezhetünk velük, majd a program végén az eredeti változók tartalmát írjuk ki a képernyőre. (Ezen megoldás elkészítése a kedves Olvasó feladata. Nincs más dolga, csak két újabb változót bevezetnie, és ezekben átmásolni az eredeti változók tartalmát…)