Jump to content

návod #3 Řetězec [**]


vEnd

Recommended Posts

  • Hlavní moderátor

Obtížnost: :2:

Osnova:
1. Úvod, co je řetězec
2. Nulový znak
3. Ukládání hodnot do řetězce
4. Závěr

1. Úvod
Zdravím Vás, dostali jsme se už ke třetímu návodu pro začínající pawnery. Ještě než se do toho pustíme, doporučuji, abyste si přečetli předchozí dva návody (návod na polenávod na proměnnou), zejména návod na pole, bez něj budete mít problémy pochopit problematiku řetězců.

O řetězci (angl. string) byla řeč již dříve. Zopakujeme si to hlavní – je to pole znaků, do kterého ukládáme texty, zprávy, hesla atd. Každá buňka obsahuje jeden znak. Do poslední buňky nic neukládáme. Proč vlastně do poslední buňky nic neukládáme? Kvůli nulovému znaku.

2. Nulový znak
Je načase, abychom si konečně vysvětlili, proč u řetězců potřebujeme buňku navíc, proč tuhle poslední buňku nikdy nezaplňujeme. Je to kvůli tzv. nulovému znaku (také EOS – End of String).

Tenhle konkrétní znak (mimochodem vypadá takhle – '\0') v Pawn totiž určuje konec řetězce. Jazyk po nás požaduje, abychom mu sdělili, když řetězec skončí. Proto je nezbytné k délce řetězce vždy přičíst jeden znak navíc, ten je vyhrazen pro tento nulový znak.

.

new pozdrav[4+1]; //deklarace řetězce, která je nám důvěrně známa z předchozího návodu na pole

pozdrav = "ahoj"; //uložení pozdravu do řetězce

.

Slovo "ahoj" má 4 znaky, celkem tedy potřebujeme řetězec o délce pěti znaků (4 + nulový znak). Abychom měli představu, jak to v tom řetězci vypadá, rozpitváme si ho:

.

pozdrav[0] = 'a'
pozdrav[1] = 'h'
pozdrav[2] = 'o'
pozdrav[3] = 'j'
pozdrav[4] = '\0' //onen nulový znak v páté buňce s indexem 4

.

Ať už potřebujeme řetězec k čemukoli, vždy musíme myslet na tento nulový znak. Pro příklad, pokud funkce SendClientMessage může odeslat zprávu o maximální délce 144 znaků, řetězec s touto zprávou musí mít délku 145.

3. Ukládání hodnot do řetězce
Existuje více způsobů, jak můžeme do řetězce něco uložit. Vlastně jich je spousta, my si ukážeme ty základní.

a) Přímé ukládání pomocí operátoru přiřazení
Tím mám na mysli rovnítko (=). Takhle jsme to dělali doposud, uvedeme identifikátor řetězce (bez hranatých závorek), rovnítko a poté text ohraničený uvozovkami (").

.

pozdrav = "ahoj";

.

Tento způsob ukládání lze použít, když přesně víme, co tam chceme uložit. Také je nutno podotknout, že ukládaný text nesmí být delší, než je délka řetězce. Upřímně si myslím, že s tímto se v praxi moc nepotkáte (akorát při inicializaci). Často je potřeba text upravit, dosadit do něj hodnoty proměnné apod. K těmto účelům nám slouží formátování.

 

b ) Formátování

Když formátujeme text, označujeme tím proces, při kterém do něj vkládáme hodnoty jiných proměnných a řetězců. Slouží nám k tomu funkce format.

.

format(output[], len, const format[], {Float,_}:...)

.

Za "output[]" dosadíme řetězec, kam chceme výsledný text uložit. Parametr "len" po nás chce délku výsledného textu. "const format[]" je onen text, který chceme formátovat. To poslední – "{Float,_}:..." – jsou proměnné/řetězce, které chceme dosadit.

 

Ukažme si to na příkladu:

.

new hrac[4+1] = "Pepa"; //takto vypadá inicializace řetězce
new penize = 500, score = 1000; //proměnné, které budeme dosazovat
new vysledek[100]; //výsledný řetězec, kde bude nás formátovaný text

format(vysledek, sizeof vysledek, "Hráč %s má %d dolarů a %d skóre.", hrac, penize, score);

.

V řetězci vysledek teď budeme mít:

Hráč Pepa má 500 dolarů a 1000 skóre.

.

Ve fomátované zprávě jsme použili jisté znaky – %s a %d. Těmto znakům se říká specifikátory. Aby ta funkce format věděla, kam má to hrac, penize a score dosadit, musíme mu to dát nějak vědět. To je účel specifikátorů. Uvádíme je vždy v tom pořadí, v jakém po sobě jdou proměnné/řetězce, které dosazujeme. Máme následující specifikátory:

 

%d nebo %i – celá čísla

%s – řetězec

%f – čísla s desetinnou čárkou

%c – znak

 

Nejsou všechny, ale jako základ nám tohle postačí.

 

4. Závěr

A to by k řetězcům bylo všechno. Konečně již víme, co je nulový znak a k čemu slouží. Už víme, jak do řetězců ukládat běžný, ale také formátovaný text. Jediné, na co jsem ještě zapomněl – pomocí sizeof jsme zjistili velikost řetězce vysledek (počet buněk toho řetězce).

 

Tento návod, stejně jako ten předchozí, je určen pro nováčky, pokročilejší věci byly buďto úplně vynechány, nebo jsou uvedeny ve spoilerech. Přesto, zdá-li se Vám, že jsem něco opomněl, někde jsem se spletl nebo se jen chcete vyjádřit, pište do tohoto tématu.

 

Ověřený návod

Tento návod prošel validací, a lze ho proto považovat za ověřený.

  • Líbí se mi to! (+1) 3
Link to comment
Share on other sites

Jen jeste jden trik :d Pokud inicializujes pole (string) pri definici, nemusis psat rozmer (ten urci obsah)

new hrac[5] = "Pepa";

lze napsat

new hrac[] = "Pepa";
Edited by ATomas
Link to comment
Share on other sites

  • Hlavní moderátor

To jsem neuvedl záměrně, chci, aby počítali s tím nulovým znakem a vždycky přičetli o jedno navíc, než je délka textu. Ale abys neřekl, že je to jen výmluva z mé strany, o dopočítání velikosti pole obecně jsem se zmiňoval v návodu na pole. :) Jinak díky za názory, jsem rád, když někdo něco napíše, cokoliv. Je to depresivní psát do větru. :d

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...