A karakter egyetlen betűt, számjegyet, írásjelet, grafikus jelet tartalmaz. Legegyszerűbb adattípusa a char. Ez 1 bájton tárolja az adott karakter ascii kódját.
Mi a string (karakterlánc)? Röviden: karakterek tárolására alkalmas típus. Hosszabban: A string nem csak egy típus, hanem osztály is. Megnézzük, milyen műveleteket végezhetünk vele. Eddig használtuk a .Length és a ToString()-et.
A teljes dokumentációja a Microsoft oldalán elérhető.
String deklarációja
string a; //ekkor csak létrehoztuk, de még nincs értéke
Ha metódusban hozzuk így létre a stringet, figyelnünk kell arra, hogy használat előtt értéket rendeljünk hozzá. Ha ezt nem tesszük fordítási hibát kapunk.
Értéket az alább módokon rendelhetünk hozzá:
a=”abc”; //Ez az „a” stringhez beállítja az „abc” szöveget
a=null; //Az „a” stringhez egy null referenciát rendeltünk.
Ilyenkor az „a”-ra hivatkozás esetén vigyáznunk kell, könnyen kaphatunk egy NullReferenceException kivételt.
a=””; Üres stringet hoztunk létre.
Az üres string és a null referencia nem egyezik meg, üres string esetén, létrejön egy string objektum, melynek hossza nulla. Null referencia esetén viszont a memóriában nem foglaltunk helyet az objektumnak.
Konkatenálás
A stringeket össze lehet fűzni:
String b = a + „abc”;
String c = String.Concat(a,b);
string s=”alma”; s = s+”fa”; //s értéke almafa lesz
String hosszának lekérdezése: Length
string s=”informatika”; esetén int i= s.Length; // i értéke 11 lesz
A karakterszámba beleszámítódnak a szóköz jelek, valamint minden nem ABC-beli betű is!
String egy részének másolása: SubString()
Pl. string s=”almafa”; esetén string m=s.SubString(2,3); jelentése: vedd az s változóban lévő string második karakteréről kezdődő 3 karakter hosszú szakaszt. Ehhez tudnunk kell, hogy a karakterek sorszámozása a string belsejében 0-val kezdődik, vagyis a=0, l=1, m=2, a=3, f=4, a=5 sorszámmal szerepel. Így a szóban forgó szövegrész az ”maf” karaktersorozat, ez kerül az m változóba. Ha olyan szakaszra hivatkozunk, ami nem létezik, akkor hibát kapunk. Ha csak egyetlen paramétert adunk meg a SubString() esetén, akkor azt jelenti, hogy a megadott pozíciótól minden további hátralévő karaktert le kell vágni. Tehát az m=s.SubString(3); esetén az m értéke ”afa” lesz.
String egy részének törlése: Remove()
A Remove() függvény segítségével karaktereket törölhetünk.
string szo=”valami”;
nyissz = szo.Remove(0,1); // -> alami Levágta az első karaktert
Karakterlánc beszúrása: Insert()
A string egy tetszőleges helyre beszúrhatunk folytonosan egy másik karakterláncot. A megadott helytől kezdve az eredeti karakterek jobbra csúsznak, és a felaszabadult helyre szúrja be az új részt.
pl: string szo = „valami”;
string teszt = szo.Insert(5,”amerika”); // -> valamiamerika lesz az eredmény
Karakter cseréje: Replace()
A String.Replace() metódus lecserél egy karaktert vagy egy karakterláncot egy másik karakterrel vagy karakterlánccal a stringben.
A C#-ban a stringek megváltoztathatatlanok. Ez azt jelenti, hogy a metódus nem helyettesíti a karaktereket vagy a karakterláncokat egy karakterláncból. A metódus új stringet hoz létre és ad vissza új karakterekkel vagy karakterláncokkal.
Levágás: Trim(), TrimStart(), TrimEnd()
Paraméterek nélkül a Trim() levágja a szóközöket a szöveg elejéről és végéről, a TrimStart() csak az elejéről, a TrimEnd() csak a végéről. Ha adunk neki paramétert, például egy a betűt, akkor ugyanazt csinálja, mint a szóközzel.
String nagybetűssé alakítása: ToUpper()
string s=”valami „string m=s.ToUpper(); //m értéke VALAMI
String kisbetűssé alakítása: ToLower()
string s=”VaLaMi „string m=s.ToLower(); //m értéke valami
Stringek karakterenkénti olvasása
A string egy karaktersorozat, melynek elemei (karakterei) be vannak sorszámozva, 0-val kezdődően. A string egy elemét el tudjuk érni az indexével (sorszámával).
string s = ”informatika”; esetén a char c = s[3]; //c értéke o lesz
Stringek kezdetének vizsgálata: StartsWith()
A string elejét meg tudjuk vizsgálni a StartsWith () metódussal.
string s=”informatika”; esetén például if (s.StartsWith(”info”)) …
A StartsWith() logikai igaz vagy hamis értéket ad vissza attól függően, hogy a string tényleg a megadott karaktersorozattal kezdődik-e. Ezen vizsgálat kisbetű-nagybetű érzékeny.
Stringek végének vizsgálata: EndsWith()
A string végét meg tudjuk vizsgálni a EndsWith () metódussal.
string s=”informatika”; esetén például if (s.EndsWith(”matika”)) …
Az EndsWith() logikai igaz vagy hamis értéket ad vissza attól függően, hogy a string tényleg a megadott karaktersorozattal végződik-e. Ezen vizsgálat kisbetű-nagybetű érzékeny.
Szöveg igazítása: PadLeft() és PadRight()
A PadLeft() segítségével megadhatjuk, hol legyen a szöveg vége! (tulajdonképpen jobb oldali margója) Az előtte levő üres helyet szóközzel, vagy a megadott karatkerrel kitölti. A PadRight() segítségével megadhatjuk hol legyen a szöveg jobb oldala, ebben az esetben a szöveg előtti üres helyet tölti ki szóközzel, vagy a megadott karakterrel.
1 2 3 4 5 6 7 |
string str = "szöveg"; Console.WriteLine(str.PadLeft(15)); //pontozzuk ki az üres részt! Console.WriteLine(str.PadLeft(15,'.')); //nézzük a PadRight-ot string szo ="másik"; Console.Write(szo.PadRight(15,'.')); |
Stringek összehasonlítása
Két string egyenlő akkor és csak akkor, ha hosszuk egyenlő, és minden karaktere rendre egyenlő. Két karakter egyenlő, ha mindkét karakternek egyforma a kódtábla szerinti kódja. A teljes stringre csak az == vagy != relációs jelek értelmezhetők! Azonban van kiskapu: CompareTo. Segítségével a teljes stringnél is működik a <,>. Abc sorrend szerint hasonlít.
1 2 3 4 5 6 7 8 9 10 11 |
string szoveg1 = "Hello, World!"; string szoveg2 = "hello, world!"; // Egyszerű összehasonlítás (a kis- és nagybetűk számítanak) bool egyformaE = szoveg1 == szoveg2; Console.WriteLine("Egyszerű összehasonlítás: " + egyformaE); // False // Összehasonlítás OrdinalIgnoreCase-szel (a kis- és nagybetűk nem számítanak) bool egyformaE2 = string.Equals(szoveg1, szoveg2, StringComparison.OrdinalIgnoreCase); Console.WriteLine("OrdinalIgnoreCase összehasonlítás: " + egyformaE2); // True Console.ReadLine(); |
A C# string.Equals függvény két string összehasonlítására szolgál. Az összehasonlítás eredménye egy logikai érték (true vagy false), amely megmutatja, hogy a két string egyenlő-e vagy sem.
StringComparison.Ordinal: Sorszám szerinti összehasonlítás, amely a karakterek Unicode kódja alapján történik. Ez a leggyorsabb összehasonlítási típus, de nem veszi figyelembe a lokációt, és a kis- és nagybetűket.
StringComparison.OrdinalIgnoreCase: Unicode kód szerinti összehasonlítás, amely figyelmen kívül hagyja a kis- és nagybetűket.
StringComparison.CurrentCulture
StringComparison.InvariantCulture
IndexOf() Karaktert vagy karakterláncot keres a megadott stringben. A függvény értéke 0 és pozitív vagy -1 lehet, attól függően, megtalálta-e a keresett értéket. -1 ha nem, 0 vagy pozitív esetén a keresett érték helyét jelzi a stringben.
Keresés: IndexOf()
pl: szöveg=”informatika” szó=”matika”
szöveg.IndexOf(szó)=4
Formázás
Alapvetően ha megadjuk fixen, mennyi tizedesjegyet írjon, és nincs annyi, akkor nulákkal kipótolja. A nagybetű a formátum kód, a kisbetű pedig a tizedesjegyek száma:
- C, c (Pénz)
Pénz formátum kód, minden szám típussal működik. A területi és nyelvi beállítások határozzák meg.
pl: Console.WriteLine(„Pénz: {0:C1}”, 1000); - D, d (Decimális)
Egész szám típusokon használható formátum jelölő. - E, e (Exponenciális)
A számokat hatvány alakban írja ki. - F, f (Fixpontos)
Fixpontos szám formátum. - G, g (Általános)
Általános szám. Exponenciális, Fixpontos, vagy Decimális megjelenítést alkalmaz. - N, n (Szám)
Szám formátum, ami minden szám típuson alkalmazható. - P, p (Százalék)
Szám típusok esetén alkalmazható.
pl: Console.WriteLine(„Százalék: {0:P3}”, 0.32456); - R, r (Round-Trip)
Float és Double típusok esetén használható. - X, x (Hexa)
Egész szám típusok esetén használható. A számot hexadecimális formában jeleníti meg.
Speciális karakterek
\t tabulátor
\n sortörés
‘Lassítás‘: using System.Threading majd Thread.Sleep(20)
Kód tördelése blokkokra: #region a blokk végére pedig: #endregion
Gyakorlás:
Vegyesen
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
string s = "Ez egy teszt szöveg ami néhány szóból áll."; Console.WriteLine(s); int hossz = s.Length; Console.WriteLine("A szöveg hossza: {0}", hossz); Console.WriteLine("Szöveg hossza: {0}",s.Length); //ha nem akarunk külön változót int poz_v = s.IndexOf("t");//első t betű helye, 0-tól számozódik Console.WriteLine("Az első t betű helye:" + poz_v); int poz_x = s.IndexOf("q");//első q helye, 0-tól számozódik Console.WriteLine("Az első q betű helye:" + poz_x);// -1, nincs a szövegben int poz_utolso_a = s.LastIndexOf("a");//utolsó ”a” helye, 0-tól számozódik Console.WriteLine("Az utolsó a betű helye:" + poz_utolso_a); Console.WriteLine(s.Substring(0, 3));//első 3 karakter, 0.-tól 3 db Console.WriteLine(s.Substring(11));//12. karaktertől int poz = s.IndexOf(" "); Console.WriteLine(s.Substring(0, poz)); Console.WriteLine(s.Substring(poz + 1)); Console.ReadKey(); |
Szó keresése Keressük meg, hogy egy megadott szövegben hányszor fordul elő egy megadott szó! A c# különbséget tesz kis és nagybetű között, ezzel most a példa nem foglalkozik. pl: keressük: eb Szöveg: Eb eb eB Találatok száma:1 lesz. Átalakíthatjuk a keresés előtt az egész szöveget kisbetűssé, és akkor már meg fogja találni a szó összes előfordulását. pl: szoveg = szoveg.ToLower();
1 2 3 4 5 6 7 8 9 10 11 12 |
string szo, szoveg; int db = 0, i = 1; Console.WriteLine("Kérem a keresett szót: "); szo = Console.ReadLine(); Console.WriteLine("Kérem a szöveget amiben keresünk: "); szoveg = Console.ReadLine(); for (i = 0; i <= szoveg.Length - szo.Length; i++) if (szoveg.Substring(i, szo.Length) == szo) db++; Console.WriteLine(); Console.WriteLine("{0} szóból {1} db van a szövegben", szo, db); Console.ReadKey(); |
Szöveg megfordítása
Írjuk ki a bekért szöveget visszafelé! A szöveg csak kisbetűkből álljon!
Az első megoldás során for ciklussal végigmegyünk visszafelé a szövegen, és betűnként hozzáadjuk egy másik stringhez.
1 2 3 4 5 6 7 8 9 |
string szoveg = "", forditott = ""; int i = 0; Console.WriteLine("Szöveg: "); szoveg = Console.ReadLine(); for (i = szoveg.Length - 1; i >= 0; i--) forditott = forditott + szoveg[i]; Console.WriteLine("Visszafelé: "); Console.WriteLine(forditott.ToLower()); Console.ReadKey(); |
Egyszerűbb megoldás: alakítsuk a szöveget tömbbé, majd rendezzük visszafelé:
1 2 3 4 5 6 |
Console.Write("Kérem, adjon meg egy szöveget: "); string szoveg = Console.ReadLine(); char[] karakterek = szoveg.ToCharArray(); Array.Reverse(karakterek); Console.WriteLine(new string(karakterek)); Console.ReadKey(); |
Színek használata a konzolos felületen
Lehetőségünk van a konzolos felületen a háttér és az előtér színét is megváltoztatni. A színekeet a ConsolColor-ral lehet megadni.
1 2 3 4 5 6 7 8 |
//tiszta képernyő, letörli a tartalmat Console.Clear(); //szövegszín legyen piros: Console.ForegroundColor = ConsoleColor.Red; //háttér színe legyen fehér: Console.BackgroundColor = ConsoleColor.White; //visszaállítás alaphelyzetbe: Console.ResetColor(); |
Kurzor pozíció beállítása
A kurzor helyét x és y koordináták segítségével lehet megadni. A kezdőpont a bal felső sarok.
1 |
Console.SetCursorPosition(x, y); |
Példa: rajzoljunk tele egy 10 sor x 10 oszlopnyi területet csilagokkal! A csillagok kiíratása balról jobbra, majd a következő sorban jobbról balra történjen!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
using System; namespace csillagos { class Program { static void Main(string[] args) { for (int y = 0; y <= 10; y++) { for (int x = 0; x <= 10; x++) { if (y % 2 == 0) { Console.SetCursorPosition(x, y); Console.Write("*"); } else { Console.SetCursorPosition(10 - x, y); Console.Write("*"); } System.Threading.Thread.Sleep(2); } } } } |
Példa: a tanult metódusok alkalmazása
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
using System; namespace szept27_stringek { class Program { static void Main(string[] args) { string szo = "Ez egy string..."; Console.WriteLine(szo); Console.WriteLine("hossza:{0}",szo.Length); Console.WriteLine("első karaktere:{0}",szo[0]); Console.WriteLine("utolsó karaktere:{0}", szo[szo.Length-1]); //Substring: index,hány karakter? Console.WriteLine(szo.Substring(3,3)); //karakterek levágása, index hány karaktert vágjon szo = szo.Remove(0,3); Console.WriteLine(szo); //karakterek beszúrása index, mit szo = szo.Insert(0, " még "); szo = szo.TrimStart(); //szóközök levágása az elejéről szo = szo.ToUpper(); //NAGYBETŰS Console.WriteLine(szo); for (int i = 0; i < szo.Length; i++) Console.WriteLine("{0}.elem: {1}", i, szo[i]); string keres = "egy"; szo = szo.ToLower(); //kisbetűs /*IndexOf - string keresése stringben. -1 esetén nincs*/ Console.WriteLine(szo.IndexOf(keres)); if (szo.IndexOf(keres) < 0) Console.WriteLine("Nem található a keresett szó"); if (szo.IndexOf(keres) >= 0) Console.WriteLine("Megtalálható a keresett szó"); } } } |
Példa: Kérjünk be egy telefonszámot (12 karakter hosszú, legyen benne +36)
Ha nem felel meg a formátumnak, akkor mindaddig ismételjük a bekérést, amíg jó nem lesz!
Ha megfelelő a formátuma, akkor nézzük meg, melyik szolgáltatóhoz tartozik a szám!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
using System; namespace okt01_tel { class Program { static void Main(string[] args) { string tsz = ""; //+36201234567 do { Console.WriteLine("Kérek egy telefonszámot!"); tsz = Console.ReadLine(); } while (tsz.Length != 12 || tsz.Substring(0,3)!="+36"); if (tsz[3] == '2') Console.WriteLine("Telenor"); if (tsz[3] == '3') Console.WriteLine("Telekom"); if (tsz[3] == '7') Console.WriteLine("Vodafone"); } } } |
Példa: Replace használata. Cseréljük le egy szó első karakterét egy másik karakterre!
Replace(mit, mire cserélünk)
A replace képes egyszerre több karaktert is lecserélni, cseréljük le az ‘e’ betűket nagy ‘E’-re!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
using System; namespace stringcsere { class Program { static void Main(string[] args) { string szo = "november"; string teszt = "--------"; Console.WriteLine(szo); Console.WriteLine(teszt); teszt = szo.Replace(szo[0], 'N'); Console.WriteLine(teszt); teszt = teszt.Replace('e','E'); Console.WriteLine(teszt); } } } |
Példa: Contians() használata
Kérj be egy szöveget, és cseréld le az összes magángangzót e-re, avagy az eszperente feladat.
( A feladat megoldható úgy is, hogy a stringet a ToCharArray() függvénnyel karakterekből álló tömbbé konvertáljuk, és egy a magánhangzókat tartalmazó char tömb elemeihez hasonlítjuk, cseréljük. )
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
Console.Write("Kérem, írjon be egy szöveget: "); string bemenet = Console.ReadLine(); string kimenet = ""; bemenet=bemenet.ToLower(); foreach (char c in bemenet) { if ("aáéiíoóuúüűöő".Contains(c)) { kimenet += "e"; } else { kimenet += c; } } Console.WriteLine("Az eszperentéül írt szöveg: {0}",kimenet); Console.ReadKey(); |
Példa: Nézzünk egy nehezebb feladatot! Ehhez már tudni kell az eljárások használatát is!
A program kérjen be a felhasználótól egy szót, majd generáljon a szó hosszával megegyező szavakat! Tulajdonképpen permutációt használunk.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
using System; class gyakorlas { /* Permutáció */ private static void permutacio(String bekert_szoveg, int kezdo_index, int veg_index) { if (kezdo_index == veg_index) Console.WriteLine(bekert_szoveg); else { for (int i = kezdo_index; i <= veg_index; i++) { bekert_szoveg = csere(bekert_szoveg, kezdo_index, i); permutacio(bekert_szoveg, kezdo_index + 1, veg_index); bekert_szoveg = csere(bekert_szoveg, kezdo_index, i); } } } /* Karakterek cseréje a felcserélt stringet adja vissza */ public static String csere(String a, int i, int j) { char temp; char[] tomb_karakterek = a.ToCharArray(); temp = tomb_karakterek[i]; tomb_karakterek[i] = tomb_karakterek[j]; tomb_karakterek[j] = temp; string s = new string(tomb_karakterek); return s; } // Fő program public static void Main() { String bekert_szoveg = "INFO"; int n = bekert_szoveg.Length; permutacio(bekert_szoveg, 0, n - 1); Console.ReadKey(); } } |