C# karakterek, Stringek

10. osztály 10évf_c# C# programozás Programozás

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.

Forrás: c# dokumentáció

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 sztringet, 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” sztringhez 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 sztringet hoztunk létre.
Az üres sztring és a null referencia nem egyezik meg, üres sztring esetén, létrejön egy sztring 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ő sztring második karakteréről kezdődő 3 karakter hosszú szakaszt. Ehhez tudnunk kell, hogy a karakterek sorszámozása a sztring 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.

Sztring nagybetűssé alakítása: ToUpper()
string s=”valami „string m=s.ToUpper(); //m értéke VALAMI

Sztring kisbetűssé alakítása: ToLower()
string s=”VaLaMi „string m=s.ToLower(); //m értéke valami

Sztringek karakterenkénti olvasása

A sztring egy karaktersorozat, melynek elemei (karakterei) be vannak sorszámozva, 0-val kezdődően. A sztring 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

Sztringek kezdetének vizsgálata: StartsWith()

A sztring 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.

Sztringek végének vizsgálata: EndsWith()

A sztring 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.

Sztringek összehasonlítása
 

Két sztring 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.

Keresés: 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.

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

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();

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.

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é:

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.

//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.

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!

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

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!

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!

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.

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.

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();
	}
}