PDA

Просмотр полной версии : [Native] format



L0ndl3m
14.11.2015, 00:01
Описание:

Преобразует строку со спецсимволами в готовую, более понятную для человека строку.

Параметры:

output[] - преобразуемая строка.
len - размер преобразуемой строки.
format[] - строка, которая должна включать в себя спецификаторы.
{Float,_}: ... - аргументы функции, которые должны соответствовать каждому спецификатору.


Возвращаемое значение:

Конкретного значения нет, но возвращает единицу.

Спецификаторы:


Спецификатор
Значение


%c
1 символ ( например f )


%d, %i
Целое число ( например 1024 )


%x
Целое число в шестнадцатеричном формате ( например 0xFF0000FF )


%f
Дробное число ( например 3.14 )


%s
Строка ( например "Pro-Pawn" )


%b
Число в бинарном виде ( например 0b001 )



Примечание: Спецификаторы должны быть в таком же порядке, в котором указаны аргументы для вызова функции.

Примеры использования:
Иногда нам нужно вывести лишь несколько знаков в дроби после запятой.
Для этого мы бы использовали спецификатор '%f', с помощью которого мы выводили бы дробное число.

Теперь давайте представим, что мы объявили константу PI. Многие знают, что данная константа математически посчитана не до конца. Количество чисел после запятой очень огромно. Возьмём первые 15 знаков после запятой, создадим константу:


const
Float: PI = 3.141592653589793; // дробная часть составляет 15 знаков

Но, что делать, если мы хотим вывести не всё значение этой константы, а только лишь часть? Например, возьмём два числа после запятой и выведем на консоль значение константы:


printf("Значение константы PI ( 2 знака после запятой ): %1.2f", PI);

Данным способом мы указали, что хотим вывести 1 число перед запятой и 2 знака после запятой. Следовательно, результат вывода будет таким:

Значение константы PI ( 2 знака после запятой ): 3.14

Хочу привести пример с получением даты. Наверняка, а скорее вы должны это знать, что число и месяц занимает 2 числа ( максимальное число в месяце: 31, последний месяц в году: 12 ).

Для оптимального вывода числа и месяца в году рекомендую использовать данный вид записи спецификатора:

%02d
Данным способом мы даём понять компилятору, что будем выводить только 2 знака.

Приведу небольшой пример кода, который будет выводить текущий месяц в году и текущее число в месяце:


new
day,
month;

getdate(_, month, day);
// с помощью функции getdate получим данные о текущей дате
// первый параметр - год, он нам не нужен, можно его пропустить, используя '_'
// в остальных же аргументах получаем текущий месяц и текущее число этого месяца

printf("Сегодняшний месяц: %02d. Сегодняшнее число: %02d.", month, day);
// выводим на консоль информацию о сегодняшней дате


Хочу также привести пример использования спецификатора '%s'. Но использовать мы его сейчас будем немного по другому.
Давайте создадим массив, который будет хранить в себе текст: "Pro-Pawn - портал о Pawn-скриптинге":


new
pp_string[] = "Pro-Pawn - портал о Pawn-скриптинге";


Теперь представим, что перед нам стоит задача вывести текст до первого пробела, то есть нам нужно вывести данную строку:

Pro-Pawn
Мы сможет это сделать используя спецификатор '%s' немного по другому:

%0.8
Почему же именно 8? Давайте посчитаем длину слова "Pro-Pawn". Длина этого слова: 8 символов.

Теперь используем спецификатор в готовом виде в функции format:


new
str[64],
pp_string[] = "Pro-Pawn.Ru - портал о Pawn-скриптинге";

format(str, sizeof(str), "Всем привет, с вами %0.8s", pp_string);
print(str);


В результате мы увидим текст:

Всем привет, с вами Pro-Pawn

Вы также можете поэкспериментировать с другими спецификаторами.

Ещё один пример использования нескольких спецификаторов сразу:


new
temp_string[128],
temp_name[MAX_PLAYER_NAME + 1],
temp_id = 12;

GetPlayerName(temp_id, temp_name, sizeof(temp_name)); // получаем никнейм игрока под ID 12
format(
temp_string,
// первым аргументом указываем строку, которую хотим преобразовать
sizeof(temp_string),
// на всякий пожарный, используйте оператор sizeof,
// для того, чтобы получить размер массива
// если размер преобразованной строки будет больше чем размер массива temp_string,
// то сервер просто-напросто накроется медным тазом ( на linux вероятность ещё больше ).
"Никнейм игрока под ID %i: %s. Первый символ никнейма игрока: %c",
// строка со спецификаторами, которую мы хотим преобразовать в готовую,
// более понятную для человека
temp_id,
// чтобы вывести ID игрока, используем сначала спецификатор '%i'
temp_name,
// чтобы вывести никнейм игрока, используем спецификатор '%s',
temp_name[0]
// чтобы вывести какой-либо символ, используем спецификатор '%c'
);

print(temp_string);
// выведем в консоль преобразованный массив temp_string

// представим, что никнейм игрока под ID 12 такой: "L0ndl3m", тогда
// в консоли сервера мы увидим строку:
// "Никнейм игрока под ID: 12: L0ndl3m. Первый символ никнейма игрока: L"


Статью подготовил: L0ndl3m (http://pro-pawn.ru/member.php?2057)


Специально для Pro-Pawn.ru (http://www.pro-pawn.ru)
Копирование данной статьи на других ресурсах без разрешения автора запрещено.

Daniel_Cortez
14.11.2015, 08:04
1. Переменная "id" не объявлена.


GetPlayerName(id, temp_name, sizeof(temp_name)); // получаем никнейм игрока под ID 12

2. Таблица спецификаторов не относится к пункту "Возвращаемое значение", поэтому стоило бы перенести её куда-нибудь ещё. Под список параметров, например.

3. Не расписано поведение format при указании цифр между "%" и спецификатором. Например, "%4s", "%4.2f" или "%5d".

Если что, я есть в XMPP. Либо могу зайти в скайп, когда доберусь до пека.

L0ndl3m
14.11.2015, 15:23
1. Переменная "id" не объявлена.

2. Таблица спецификаторов не относится к пункту "Возвращаемое значение", поэтому стоило бы перенести её куда-нибудь ещё. Под список параметров, например.

3. Не расписано поведение format при указании цифр между "%" и спецификатором. Например, "%4s", "%4.2f" или "%5d".

Если что, я есть в XMPP. Либо могу зайти в скайп, когда доберусь до пека.

Спасибо за поправки, в скором времени исправлю.

Daniel_Cortez
11.12.2015, 11:21
Пока не забыл, напишу здесь.


Обновление 0.3.7 R2
Добавлен спецификатор "%q" в функции format. Он предназначен для форматирования строковых значений, как и "%s", но дополнительно пропускает форматируемое значение через экранирующую функцию в SQLite. Нововведение может быть полезно для защиты от SQL-инъекций.