Форматування рядка за допомогою printf та format
| За допомогою оператораformatможна передати до рядка значення змінних або функцій, інших рядків і просто текст, який потрібно передати до рядка. |
У функції якщо не брати до уваги, скільки всього буде передано в рядок, всього 4 аргументи.
- Перший аргумент, це ім'я рядка, в якому зберігатиметься форматований рядок.
- Другий аргумент довжина цього рядка зазвичай замість довжини рядка використовують функціюsizeofз ім'ям рядка в якості аргументу цієї функції.
- Потім третім аргументом слідує текст у лапках і керуючі символи. Керуючі символи наведені нижче:
У рядок можна передати необмежену кількість значень, скільки значень передається, стільки й керуючих символів у рядку.
Головне дотримуватися типів переданих даних.
- При передачіцілого числа в рядок, потрібно використовувати керуючий символ (%d) цілісного типу,
- при передачідесяткового числа(%f) керуючий символ речовинного типу,
- при передачііншого рядкапотрібно використовувати керуючий символ -%sі так далі.
new Pawn[6] = "world!"; new Samp[7] = “Hello, ”; new string[13];
Принцип роботи функції такий. Він бере значення зі змінної Samp вказаної в наведеному нижче прикладі і підставляє замість керуючого символу%s, отримує текст «Hello, world!».
1format(string,sizeof(string),"%s world!",Samp);
Можна передати в рядок одразу 2 або більше значення. Для цього в третьому аргументі в лапках ставимо керуючий знак у те місце, куди необхідно буде вставити значення. Потім в залежності від того куди ми поставили керуючий символ, в 4-му аргументі через ком вказуємо рядок або змінну, з якої буде братися значення.
Головне дотримуватися порядку. Перша змінна або рядок у 4-му аргументі передається своє значення в 1-ий керуючий символ у 3-му аргументі, друга в другій, третя в третій, як показано на прикладі нижче:
1 format(string,sizeof(string),"%s%s,Samp, Pawn);
Можна не вказувати ні рядків, ні змінних, а текст, який нам потрібно вставити, приклад:
1 format(string,sizeof(string),"%s" , "Hello, world!");
Усі вищезгадані приклади мають однаковий результат. Крім всього вищезгаданого в рядок можна вставляти такі символи:
\bbackspaсe\fForm feed\nперехід на новий рядок\rповернення каретки\tтабуляція\vвертикальна табуляція\'одиночна лапка\"подвійні лапки\?знак питання
Функціяprintfаналогічна, вона як функція format тільки без першого та другого аргументу, і значно простіше, тому що їй не потрібно жодних рядків. Вона виводить форматований рядок у консоль. Ось так виглядає функція, аналогічна до функції на прикладі вище.
1 printf("%s" , "Hello, world!");
Отже, для закріплення уроку розглянемо наведений нижче приклад:
public OnPlayerConnect(playerid) new plname[MAX_PLAYER_NAME]; New string [50]; GetPlayerName(playerid,plname,24); format(string,sizeof(string),"*** %s зайшов на сервер. (ID:%d)",plname,playerid); SendClientMessageToAll(COLOR_GREEN,string); return 1; >
Для того, щоб вивести повідомлення всім гравцям, існує функція SendClientMessageToAll.
У дужках функції два аргументи.
- перший аргумент, колір повідомлення, куди ми підставляємо HEX-код кольору або замінюємо його константою для зручності,
- другий аргумент - текст, який виводиться в чат всім гравцям.
- Перший рядок зберігатиме ім'я гравця,
- друга зберігатиме відформатований текст повідомлення, що передається гравцям.
Ім'я нам відомо, ID гравця теж, тепер настав час приступити до форматування рядка.
Пишемо функціюformatі першим аргументом функції вказуємо зміннуstring, де зберігатиметься повідомлення. Другим аргументом за допомогою функціїsizeof, передаємо розмір цієї змінної. У третьому аргументі функції пишемо текст. Ім'я, це рядок, для передачі в рядок, потрібен керуючий символ рядок (%s), ID гравця, це ціле число, для передачі в рядок, потрібен керуючий символ цілого типу (%d).
1 format(string,sizeof(string),"*** %s зайшов на сервер. (ID:%d)",plname,playerid); // Це правильно
Функція по порядку передасть значення між 3 та 4 аргументами функції. Зі змінноїplnameв перший керуючий символ у рядку (%s), ID гравцями передаємо з параметра playerid до другого керуючого символу (%d).
1 format(string,sizeof(string),"*** %s зайшов на сервер. (ID:%d)",playerid,plname); // Це не правильно
Вище показаний свідомо неправильний приклад. Ми не можемо передати ID гравця тобто ціле число в керуючий символ рядок, так як число це не текст (не рядок). Ім'я гравця ми також не можемо передати в керуючий символ цілого типу, тому що рядок (або текст) це не число. При форматуванні рядка дотримуйтесь типів даних, що передаються, і керуючі символи для цих типів.