B blokk · Változók és típusok · 4. tananyag
A felhasználóval szöveggel beszélünk: üzenetek, nevek, menük — a Mastermind táblája is szöveg lesz. Ma törlesztünk két adósságot is: az A6-os idézőjel-rejtély megoldását (escape), és a régóta ígért string-interpolációt.
char, és mi köze a Unicode-hoz.string alapjait: literál, üres szöveg, Length.+-szal — és ismered a csapdáit.\n, \t, \", \\) és a verbatim (@"…") formát.$"…{kifejezés}…".A char pontosan egy karaktert tárol,
aposztrófok között (B1):
char monogram = 'A'; char szamjegy = '7'; // ez KARAKTER, nem szám! char szokoz = ' '; // a szóköz is karakter
A motorháztető alatt a char valójában
szám: minden karakternek kódja van a Unicode
táblázatban — az 'A' a 65-ös, az
'a' a 97-es, a '0' a 48-as.
Ezért tud a gép betűket rendezni és összehasonlítani. A kódokat a B6-os
konverziókkal fogjuk majd kiolvasni; most elég a kép: a char egy szám,
ami karakternek öltözött.
A string akárhány karakter sorozata,
idézőjelek között:
string nev = "Anna"; string ures = ""; // üres szöveg — 0 karakter, de létező érték string mondat = "Szia, világ!";
A string a legbeszédesebb bizonyítéka a „minden objektum” szálnak
(A3): még a
literálnak is vannak képességei. A leghasznosabb a
Length — a karakterek száma:
string nev = "Anna"; Console.WriteLine(nev.Length); // 4 Console.WriteLine("C#".Length); // 2 — ismerős az A3.4 feladatból?
A Length mögött nem metódus áll (nincs zárójel!),
hanem tulajdonság (property) — a különbséget a H blokkban
tanuljuk. A string további képességei (keresés, darabolás, indexelés) az
I. blokk témái.
A + szövegek között összefűzést jelent:
string keresztnev = "Anna"; string udvozles = "Szia, " + keresztnev + "!"; Console.WriteLine(udvozles); // Szia, Anna!
Ha a + egyik oldala string, a másik oldal — akár szám
is — szöveggé válik:
int pont = 87; Console.WriteLine("Pontszám: " + pont); // Pontszám: 87
Console.WriteLine("1" + 2); // 12 — a "1" szöveg, a 2 hozzáfűződik! Console.WriteLine(1 + 2 + " db"); // 3 db — balról jobbra: előbb 1+2=3 Console.WriteLine("db: " + 1 + 2); // db: 12 — itt viszont már szövegként!
A szabály (a B3-ból ismerős
balról-jobbra): a + mindig a két aktuális
operandusát nézi. Amint az egyik string, onnantól minden fűzés.
Hogyan írsz a stringbe sortörést? Vagy éppen idézőjelet — hiszen az lezárná a
literált (A6,
A9)?
A megoldás a visszaper (\):
a mögötte álló karakter különleges jelentést kap:
| Escape | Jelentése | Példa |
|---|---|---|
\n | új sor (sortörés) | "első\nmásodik" |
\t | tabulátor | "Név:\tAnna" |
\" | idézőjel a stringben | "Ő azt mondta: \"szia\"" |
\\ | maga a visszaper | "C:\\temp\\uj" |
\' | aposztróf (char-ban kell) | char c = '\''; |
Console.WriteLine("Első sor\nMásodik sor"); Console.WriteLine("Név:\tAnna\nPont:\t87"); Console.WriteLine("Ő azt mondta: \"szia\""); // az A6-os rejtély megoldva!
Windows-útvonalaknál a sok \\ fárasztó — és veszélyes
is: a "C:\temp"-ben a \t
tabulátorrá válik! A @ előtag
kikapcsolja az escape-értelmezést:
string rossz = "C:\temp\uj"; // ⛔ a \t tab lenne, a \u pedig hiba (CS1009)! string jo1 = "C:\\temp\\uj"; // ✔ escape-elve string jo2 = @"C:\temp\uj"; // ✔ verbatim — a \ itt csak egy \
Az A9-ben
láttad: a Visual Studio a string közepén ütött Entert +-os
összefűzéssé alakítja. Most már a másik irányt is érted: ha a kiírt
szövegBE kell sortörés, az nem Enter, hanem \n.
Döntsd el mindegyik sorról: lefordulna-e így?
A +-os fűzés hosszú szövegnél nehezen olvasható.
A string-interpoláció ($"…") ugyanazt
tudja, csak elegánsabban — ahogy a
B1 és a
B3 fejezetek ígérték: a
$ jeles literálban a kapcsos zárójelek közé
kifejezést írhatsz, és az értéke a szövegbe kerül:
string nev = "Anna"; int pont = 87; Console.WriteLine($"Szia, {nev}! Pontszámod: {pont}."); // Szia, Anna! Pontszámod: 87.
A kapcsos zárójelben bármilyen kifejezés állhat — számítás is:
int db = 3; decimal ar = 899.50m; Console.WriteLine($"{db} db × {ar} Ft = {db * ar} Ft"); // 3 db × 899.50 Ft = 2698.50 Ft
Két apróság:
$ az idézőjel ELŐTT áll. Ha
lemarad, a program a kapcsos zárójeleket szó szerint írja ki:
Szia, {nev}! — ez a leggyakoribb interpolációs hiba.$"Név:\t{nev}".+ (konkatenáció) | $"…" (interpoláció) | |
|---|---|---|
| rövid fűzés (2 darab) | rendben | rendben |
| több változó, mondatszerű szöveg | nehezen olvasható | ezt válaszd |
| a VS tördeli a hosszú literált (A9) | ezt használja | — |
Ökölszabály: alapértelmezésben interpolálj — a kódot olvasó ember (A9!) egyben látja a mondatot. (A számok formázása — pl. két tizedesjegy — a B5 témája lesz.)
| Tünet | Mi történt? | Mit tegyél? |
|---|---|---|
CS1009: Unrecognized escape sequence | "C:\uj" — a \u nem érvényes escape | \\ vagy @"…" |
A \t helyén tabulátor jelent meg az útvonalban | a "C:\temp" \t-je escape-ként értelmeződött | verbatim: @"C:\temp" |
CS1012: Too many characters in character literal | char c = 'AB'; — a char csak EGY karakter | ha több kell: string |
CS0029 string és char keverésénél | char c = "A"; vagy string s = 'A'; | idézőjel = string, aposztróf = char (B1!) |
A kimenetben {nev} jelenik meg kapcsostul | lemaradt a $ az idézőjel elől | $"…{nev}…" |
"1" + 2 eredménye 12 | a + string mellett fűz, nem összead | előbb számolj zárójelben, vagy külön változóban |
Szovegek, .NET 10.string nev = "Kiss Anna"; string osztaly = "11.I"; int eletkor = 17; Console.WriteLine($"Név:\t\t{nev}\nOsztály:\t{osztaly}\nÉletkor:\t{eletkor} év");
\t-k oszlopba igazítanak, a
\n-ek sort törnek — egyetlen
WriteLine-ból többsoros, rendezett kimenet lett.\\), verbatimmal
(@), és próbáld ki szándékosan rosszul is
("C:\uj") — nézd meg a CS1009-et az Error Listben."1" + 2 ·
1 + 2 + " db" ·
"db: " + 1 + 2db,
egysegAr (decimal!) változókból:
3 db × 899.50 Ft = 2698.50 Ft.Szovegkezeles alapok gyakorlat).A névjegyed oszlopba igazítva, több sorban jelenik meg egyetlen WriteLine-ból; láttad a CS1009-et; a csapda-kísérlet mindhárom eredményét előre eltaláltad.
⭐ alap · ⭐⭐ haladó · ⭐⭐⭐ kihívás
Deklarálj egy char-t és egy egykarakteres
string-et. Írd le egy mondatban a különbséget —
jelölésben és típusban.
Mit ír ki? Előbb papíron!
Console.WriteLine("Alma\tKörte\nSzilva"); Console.WriteLine("A \"C#\" szó 2 jelből áll."); Console.WriteLine("2" + 2 + 2);
Írd át +-os fűzésről interpolációra:
Console.WriteLine("A(z) " + termek + " ára " + ar + " Ft, készleten: " + db + " db.");
Miért lett olvashatóbb?
Készíts „ASCII-táblázatot” escape-ekkel: három termék neve és ára,
\t-kkel oszlopba igazítva, fejlécsorral.
(Egy-egy hosszú név miatt szétcsúszhat a táblázatod — a szép igazítás igazi
eszközeit az I. blokkban kapod meg.)
A nev.Length segítségével írasd ki:
Anna nevének hossza: 4. Aztán trükközz: mit ad a
"".Length? És a " ".Length?
Mit mond ez az üres és a szóközös string különbségéről? (Az
A3.4-ben a
sharplabon már láttad a "C#".Length-et — most már
a saját gépeden a saját változóiddal megy.)
Minden kérdésnél egy válasz helyes. A végén pontszámot kapsz.
| Fogalom | Jelentés |
|---|---|
char | egyetlen karakter, aposztrófok között — a háttérben Unicode-kód (szám) |
| Unicode | a karakterek nemzetközi kódtáblája: minden jelnek száma van ('A' = 65) |
string | karakterek sorozata, idézőjelek között |
üres string ("") | 0 karakter hosszú, de létező szöveg |
Length | a string karaktereinek száma — az első tulajdonság (property), amit használsz |
konkatenáció (+) | szövegek összefűzése; string mellett a szám is szöveggé válik |
| escape-karakter | \ + jel: különleges jelentés (\n sor, \t tab, \" idézőjel, \\ visszaper) |
verbatim string (@"…") | a \ benne nem escape — Windows-útvonalakhoz |
string-interpoláció ($"…") | a {kifejezés} értéke a szövegbe kerül — az olvasható fűzés |
char egy karakter (aposztróf),
a háttérben Unicode-szám; a string
karakterek sorozata (idézőjel) — a Length
megmondja, hány.+ string mellett fűz: a szám
szöveggé válik. Balról jobbra — 1 + 2 + " db" →
3 db, de "db: " + 1 + 2 →
db: 12.\n, \t,
\", \\ — az A6-os
idézőjel-rejtély ezzel oldódott meg.@"C:\temp" —
a \ benne csak egy \.$"Szia, {nev}!" —
kifejezés is állhat a kapcsosban, és a kód olvashatóbb. A
$ az idézőjel ELŐTT áll. (Számformázás: B5.)