C# programozás kezdőknek › 2.5 lecke
C# tanfolyam · 2.5 lecke
Szövegek kezelése: string metódusok és formázás
Nevek, üzenetek, jelszavak, kasszablokkok: a programok tele vannak szöveggel. Ebben a leckében megtanulod szétszedni, átalakítani és szépen kiírni a szövegeket, és az átlagkalkulátorod is profi kinézetet kap.
A lecke végére
- eléred egy szöveg hosszát és egyes karaktereit;
- a leggyakoribb string metódusokkal átalakítod és vizsgálod a szöveget;
- tudod, hogy a string nem változik meg, a metódus újat ad vissza;
- különleges karaktereket (új sor, idézőjel) írsz a szövegbe;
- tizedesjegyre kerekítve, igazítva, ezres tagolással írsz ki számokat.
Ehhez használod
- a string és a char típust (2.1);
- az adatbekérést (2.2) és a bool típust (2.2.1);
- a mini projekt átlagkalkulátorát (2.4).
Mi a string? Karakterek sorban
A string (szöveg) karakterek sorozata, mint a gyöngyök egy fonalon. Minden karakternek van egy sorszáma, az indexe, és a számolás 0-tól indul:
string nev = "Kamilla";Console.WriteLine(nev.Length); // 7Console.WriteLine(nev[0]); // KConsole.WriteLine(nev[2]); // m🔮 Jósold meg!
Mit ír ki a nev[nev.Length - 1]? És miért nem működik a nev[nev.Length]?
Megoldás
Az első az utolsó karaktert adja: „a”. A 7 hosszú szöveg indexei 0-tól 6-ig tartanak, így a 7-es index már nem létezik: a program futás közben hibával leáll (IndexOutOfRangeException). Az egyes karakterek char típusúak, ahogy a 2.1 leckében láttad.
A legfontosabb string metódusok
A példákban: string s = " Szia Világ "; (az elején és a végén két-két szóközzel).
| Metódus | Mit csinál? | Példa és eredmény |
|---|---|---|
Trim() | Levágja a szóközöket az elejéről és a végéről | s.Trim() → „Szia Világ” |
ToUpper(), ToLower() | Csupa nagy- vagy kisbetű | "Szia".ToUpper() → „SZIA” |
Contains("…") | Benne van-e a megadott rész? (bool) | s.Contains("Vil") → true |
StartsWith, EndsWith | Ezzel kezdődik, ezzel végződik? (bool) | "kep.png".EndsWith(".png") → true |
IndexOf("…") | Hányadik helyen kezdődik? (-1, ha nincs benne) | "Szia Világ".IndexOf("V") → 5 |
Substring(kezdet, hossz) | Kivág egy darabot | "Szia Világ".Substring(5, 3) → „Vil” |
Replace("mit", "mire") | Kicserél egy részt | "alma".Replace("a", "o") → „olmo” |
string.IsNullOrWhiteSpace(s) | Üres-e, vagy csak szóközből áll? (bool) | string.IsNullOrWhiteSpace(" ") → true |
✍️ Próbáld ki!
Kérd be a kedvenc filmed címét, és írd ki: a hosszát, csupa nagybetűvel, és hogy szerepel-e benne az „a” betű. A Visual Studióban ha a változó neve után pontot teszel, az IntelliSense felsorolja az összes metódust: nézz körül, mi minden van még!
A nagy csapda: a string nem változik meg
string nev = "bence";nev.ToUpper();Console.WriteLine(nev);🔮 Jósold meg!
„BENCE” vagy „bence” jelenik meg?
Megoldás
„bence”! A string megváltoztathatatlan (angolul immutable): a metódusok nem az eredetit írják át, hanem egy új szöveget adnak vissza. Ha meg akarod tartani, el kell tárolni: nev = nev.ToUpper();
Láncolás
Mivel minden metódus új szöveget ad vissza, egymás után is írhatod őket: string tiszta = beirt.Trim().ToLower(); Ez először levágja a szóközöket, aztán kisbetűssé alakít.
Különleges karakterek
| Jelölés | Jelentése |
|---|---|
\n | új sor |
\t | tabulátor (ugrás a következő oszlopra) |
\" | idézőjel a szövegen belül |
\\ | egy fordított perjel |
@"C:\Mappa\fajl.txt" | szó szerinti szöveg: a fordított perjelek nem különleges jelek (fájlútvonalakhoz kényelmes) |
Console.WriteLine("Első sor\nMásodik sor");Console.WriteLine("Azt mondta: \"Szia!\"");Első sorMásodik sorAzt mondta: "Szia!"Formázott kiírás
A 2.2 leckében már használtad a $"…{valtozo}…" szövegbe illesztést (interpolációt). A kapcsos zárójelben kettőspont után formátumot is megadhatsz:
| Formátum | Jelentése | Példa (magyar beállítással) |
|---|---|---|
{x:F2} | 2 tizedesjegy | 4,666… → „4,67” |
{x:F0} | egészre kerekítve | 4,6 → „5” |
{n:N0} | ezres tagolás | 1250000 → „1 250 000” |
{r:P0} | százalék | 0,85 → „85%” |
{nev,-10} | 10 karakter széles, balra igazítva | „Anna ” |
{pont,5} | 5 karakter széles, jobbra igazítva | „ 42” |
Tizedesvessző vagy pont?
A formázás a számítógép nyelvi beállításait követi: magyar Windowson tizedesvesszővel („4,67”), angolon ponttal („4.67”). Ugyanez igaz a beolvasásra: magyar gépen a double.Parse a „4,5”-öt érti. A kódban viszont mindig pontot írunk: double x = 4.5;
Szép átlagkalkulátor
Az átlagkalkulátor működik, de a kinézetén van mit csiszolni: ha a felhasználó azt írja, hogy „ kovács anna ”, a program pontosan így írja vissza. Javítsuk meg!
// A név megtisztítása: szóközök le, első betű nagy, a többi kicsinev = nev.Trim();nev = nev.Substring(0, 1).ToUpper() + nev.Substring(1).ToLower();Console.WriteLine("===============================");Console.WriteLine($"{"Tanuló:",-10}{nev}");Console.WriteLine($"{"Jegyek:",-10}{jegy1}, {jegy2}, {jegy3}");Console.WriteLine($"{"Átlag:",-10}{atlag:F2}");Console.WriteLine("===============================");===============================Tanuló: Kovács annaJegyek: 5, 4, 5Átlag: 4,67===============================🔮 Gondold végig!
A kimenetben „Kovács anna” szerepel, nem „Kovács Anna”. Miért? És mi történne, ha a felhasználó semmit nem írna be névként?
Megoldás
A kódunk csak a legelső betűt teszi naggyá, a többit kicsivé: a második szó elejét nem ismeri fel. Ehhez a szavakat szét kellene bontani, ezt a 6. fejezetben (Split) tanulod. Üres név esetén a Substring(0, 1) hibával leállna, mert nincs első karakter. A helyes reakcióhoz elágazás kell: a következő, 3.1 leckében megtanulod!
Hibavadászat
🐞 1. Elveszett átalakítás
string valasz = Console.ReadLine();valasz.Trim().ToLower();Console.WriteLine(valasz == "igen");Mi a baj?
Az átalakított szöveg sehová nem került, a valasz változatlan. Helyesen: valasz = valasz.Trim().ToLower(); Így az „ Igen ” beírásra is true lesz az eredmény.
🐞 2. Túl hosszú darab
string szo = "Pécs";Console.WriteLine(szo.Substring(2, 5));Mi a baj?
A 2. indextől csak 2 karakter van („cs”), nem 5, ezért a program futás közben leáll (ArgumentOutOfRangeException). A Substring második száma a hossz, nem a záró index, és nem lóghat túl a szöveg végén.
🐞 3. Útvonal fordított perjellel
string ut = "C:\temp\nevsor.txt";Mi a baj?
A \t tabulátort, a \n új sort jelent, így az útvonal összezavarodik. Helyesen dupla perjellel ("C:\\temp\\nevsor.txt") vagy szó szerinti szöveggel: @"C:\temp\nevsor.txt". A fájlkezelésnél (6. fejezet) ez még jól jön!
Kihívások
🦊 1. Becenév-generáló
Kérd be a vezeték- és a keresztnevet, és készíts belőlük becenevet: a vezetéknév első három betűje + a keresztnév első két betűje, csupa nagybetűvel. (Kovács Anna → KOVAN)
Egy lehetséges megoldás
Console.Write("Vezetéknév: ");string vezetek = Console.ReadLine().Trim();Console.Write("Keresztnév: ");string kereszt = Console.ReadLine().Trim();string becenev = (vezetek.Substring(0, 3) + kereszt.Substring(0, 2)).ToUpper();Console.WriteLine($"A beceneved: {becenev}");Gondold végig: mi történik egy kétbetűs vezetéknévvel (például Ló)?
✍️ 2. Monogram
Kérd be a teljes nevet egy sorban (például „Szabó Péter”), és írd ki a monogramot: „SZ. P.”. Tipp: az IndexOf(" ") megmondja, hol van a szóköz. (A „SZ” kétjegyű betű: elég, ha a te megoldásod az első karaktert veszi, „S. P.” is jó!)
🔐 3. Jelszó-ellenőrző (if nélkül!)
Kérj be egy jelszót, és írd ki true vagy false értékkel: legalább 8 karakter-e; van-e benne nagybetű; és hogy NEM tartalmazza-e a „jelszo” szót (kis- és nagybetűtől függetlenül).
Egy lehetséges megoldás
Console.Write("Jelszó: ");string j = Console.ReadLine();bool elegHosszu = j.Length >= 8;bool vanNagybetu = j != j.ToLower();bool nemJelszoSzo = !j.ToLower().Contains("jelszo");Console.WriteLine($"Legalább 8 karakter: {elegHosszu}");Console.WriteLine($"Van benne nagybetű: {vanNagybetu}");Console.WriteLine($"Nem a „jelszo” szó: {nemJelszoSzo}");Ügyes trükk: ha a jelszó nem egyezik a saját kisbetűs változatával, akkor volt benne nagybetű! A ! jel tagadást jelent: a 3.2 leckében részletesen megismered.
🧾 4. Kasszablokk
Írj ki egy blokkot három termékkel, oszlopokba igazítva: a termék neve balra (15 karakter), az ár jobbra (8 karakter), ezres tagolással, a végén az összeggel. Például: „Pizza 3 490 Ft”.
Tipp
Egy sor: Console.WriteLine($"{"Pizza",-15}{3490,8:N0} Ft");. Az igazítás és a formátum együtt is használható: először a szélesség, utána a kettőspont és a formátum.
Összefoglalás
- A string karakterek sorozata; az indexelés 0-tól indul, a hossz a
Length. - A
Trim, aToUpper, aContains, azIndexOf, aSubstringés aReplacea leggyakoribb metódusok. - A string nem változik meg: az eredményt el kell tárolni (
s = s.Trim();). - Különleges karakterek:
\n,\t,\"; útvonalhoz@"…". - Formázás:
{x:F2},{n:N0},{s,-10}; a tizedesjel a gép nyelvi beállításától függ.
Tanároknak
Kerettantervi kapcsolódás
NAT 2020, Digitális kultúra, 9. évfolyam, Algoritmizálás és formális programozási nyelv használata: adattípusok, szöveges adatok kezelése, adatok formázott megjelenítése. A szövegfeldolgozás az emelt szintű érettségi programozási feladatainak egyik alapja.
Módszertan
A lecke a Microsoft Learn szövegformázási és string-metódusos C#-moduljaira épül. Szándékosan nem használ elágazást (a 3.1 előtt áll): a feltételes viselkedés helyett logikai értékek kiírásával dolgozik, ami a 2.2.1 lecke bool-ismereteit mélyíti. A „megváltoztathatatlan string” jóslós feladat a leggyakoribb tévképzetet célozza. Az üres név esete tudatos előrejelzés a 3.1 leckére.
Időterv
Mi a string: 7 perc. Metódusok: 12 perc. A nagy csapda: 5 perc. Különleges karakterek: 5 perc. Formázás: 8 perc. Szép kalkulátor: 8 perc. A hibavadászat és a kihívások otthoni vagy differenciáló feladatok.
Következő lecke: 3.1 Feltételek – if és else
A programod eddig minden sort végrehajtott. Most megtanítod dönteni: ha valami igaz, csináljon egyet, ha nem, mást.

