Всё о сервере, форум!
Основы программирования
ИНФОРМАЦИОННО-РАЗВЛЕКАТЕЛЬНЫЙ ПОРТАЛ

PrR[ Проект SAMP - Romashka [0.3e] ™18+™

Pawn :: Основы скриптинга
Форматирование строки c помощью printf и format

С помощью оператора format можно передать в строку значения переменных или функций, других строк и просто текст, который нужно передать в строку.

У функции если не считать, сколько всего будет передано в строку, всего 4 аргумента.
  • Первый аргумент, это имя строки, в которой сохранятся форматированная строка.
  • Второй аргумент длина этой строки, обычно вместо длины строки используют функцию sizeof с именем строки в качестве аргумента этой функции.
  • Затем третьим аргументом следует текст в кавычках и управляющие символы. Управляющие символы приведены ниже:
%b          Бинарный тип
%c            Символьный тип
%d, %i    Целочисленный тип
%f             Число с плавающей точкой – вещественный тип
%s             Строка

В строку можно передать неограниченное количество значений, сколько значений передается, столько и управляющих символов в строке.

Главное соблюдать типы передаваемых данных.
  • При передачи целого числа в строку, нужно использовать управляющий символ (%d) целочисленного типа,
  • при передачи десятичного числа (%f) управляющий символ вещественного типа,
  • при передаче другой строки нужно использовать управляющий символ - %s и так далее.
Привожу для следующего примера инициализированные строки и заранее одну пустую строку где будет сохранен форматированный текст:

new Pawn[6] = “world!”;
new Samp[7] = “Hello, ”;
new string[13];


Принцип работы функции такой.
Он берет значение из переменной Samp указанной в нижеприведенном примере и подставляет вместо управляющего символа %s, получает текст «Hello, world!».

 1 format(string,sizeof(string),”%s world!”,Samp);

Можно передать в строку сразу 2 или более значения. Для этого в 3-ем аргументе в кавычках ставим управляющий символ в то место, куда нужно будет вставить значение. Затем в зависимости от того куда мы поставили управляющий символ, в 4-ом аргументе через запятую указываем строку или переменную, из которой будет браться значение.

Главное соблюдать порядок.
Первая переменная или строка в 4-ом аргументе передается свое значение в 1-ый управляющий символ в 3-ем аргументе, вторая во второй, третья в третий, как показано на примере ниже:

1 format(string,sizeof(string),”%s %s”,Samp, Pawn);

Можно не указывать ни строк, ни переменных, а текст, который нам нужно вставить, вот пример:

1 format(string,sizeof(string),”%s” , ”Hello, world!”);

Все вышеуказанные примеры имеют одинаковый результат. Кроме всего вышеуказанного в строку можно вставлять следующее символы:

\b  backspaсe
\f   Form 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-код цвета либо заменяем его константой для удобства,
  • второй аргумент – текст, выводимый в чат всем игрокам.
Итак, для того чтобы вывести сообщение всем игрокам, для начала нам нужно 2 строки (одномерных массива). MAX_PLAYER_NAME – это встроенная константа, она равна 24, то есть максимальной длине имени игрока.
  • Первая строка будет хранить имя игрока,
  • вторая будет хранить отформатированный текст сообщения, передаваемый игрокам.

Функция GetPlayerName получает имя игрока, и как показано во 2 аргументе функции, передает в переменную plname это имя.

Имя нам известно, 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 игрока то есть целое число в управляющий символ «строка», так как число это не текст (не строка). Имя игрока мы также не можем передать в управляющий символ целочисленного типа, так как строка (или текст) это не число. При форматировании строки соблюдайте типы передеваемых данных и управляющие символы для этих типов.



Логин: Пароль:
Забыли пароль?Регистрация
При копировании материала с сайта активная ссылка обязательна!
Сайт управляется SiNG cms © 2010-2015