sprintf — форматирует и запоминает наборы символов и значений.

 

Описание:

u8 sprintf(u8 *buf, u8 *string[, u8 arg-list…]);

Записывает в buf аргументы из списка arg-list, под управлением строки string, и возвращает длину преобразованной строки buf. Каждый аргумент arg-list (если он есть), преобразуется и выводится согласно соответствующей спецификации формата указанной в string.

Список параметров:

buf

Указатель на строку.

string

Строка или указатель на строку управления формата.

Строка управления формата состоит из обычных символов, escape-последовательностей и, если за строкой формата следуют аргументы, еще и спецификации формата. Если за строкой формата следуют аргументы arg-list, то эта строка также должна содержать спецификации формата, определяющие вывода этих аргументов. Спецификация формата всегда начинается с символа знака процента (%).

Строка формата читается слева направо. Когда встречается спецификация формата (если она есть), то значение первого аргумента после строки формата преобразовывается и выводится согласно заданной спецификации. Вторая спецификация формата вызывает преобразование и вывод второго аргумента и так далее, до конца строки формата. Если аргументов больше, чем спецификаций формата, то эти дополнительные аргументы игнорируются.

Спецификация формата имеет следующую форму:

%[flags][wigth][.precision]type.

Где:

% – символ спецификации формата;

[flags] – Включение вывода и печати знаков, пробелов, восьмеричных и шестнадцатеричных префиксов (Таблица flags).

[wigth] – Минимальное число выводимых символов (Описание: wigth ниже).

[.precision] – Максимальное число символов (для %s), или минимальное число цифр(для печати целых значений %d %u %i).

type – спецификация формата (Таблица type).

Таблица спецификация формата (type)

Символ Описание:
s Строка
символов
p Значение
указателя
d Десятичное
число целого типа со знаком
i Десятичное
число целого типа со знаком
e Научная
нотация (е нижнего регистра)
E Научная
нотация (Е верхнего регистра)
o Восьмеричное
целое число без знака
u Десятичное
число целого типа без знака
x Шестнадцатеричное
целое число без знака (буквы нижнего
регистра)
X Шестнадцатеричное
целое число без знака (буквы верхнего
регистра)
% Символ
%
c Символы

Значения flags

Флаг Значение Значение
по умолчанию
Смещение
результата влево внутри поля wigth.
Смещение
вправо.
+ Присоединение
знака к выводимому значению, если
оно имеет знаковый тип.
Знак
“-” появляется толькодля
отрицательных знаковых значений.
# При
использовании с форматами o, x, X, флаг
# присоединяет к любому ненулевому
выводимому значению, соответственно,
0, 0х, 0Х.
Без
префикса.

Width – неотрицательное десятичное целое, контролирующее число напечатанных символов. Если число символов в вывода меньше,
чем в width, слева и справа добавляются пробелы (в зависимости от того, где определен флаг “-“), пока минимальная
ширина не будет достигнута. Если к width присоединяется 0, то 0 будут добавляться до тех пор, пока не будет достигнут
минимум width. (Это не применяется для чисел, смещенных влево).

В спецификации width может быть звездочка (*), когда вместо значения подставляется соответствующий ему аргумент из списка
аргументов. Аргумент width должен предшествовать соответствующему значению.

arg-list

Переменное число параметров.

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

Функция возвращает длину строки buf после преобразования.

Примеры:

<--! Пример 1 -->
<item addr="524:248" name="Тест для функции sprintf" type="script">
u8 count = 0;
V-ID/V-ADDR {
if(opt0()) {
	// строка для вывода результата в интерфейс
	u8 strForMess[100];
	u8 str[] = "hello";
	if(count == 0) {
		// %s Строка символов
		u8 resultOfFunc = sprintf(strForMess, "%cСтрока - %s и %s, len = ", 1, str, "world");
		ltoa(strForMess+strlen(strForMess), resultOfFunc);
		setStatus(@exciterId():32, &strForMess);
		setStatus(V-ADDR, 0);
		++count;
		return;
	}
	 
	if(count == 1) {
		// %p - значение указателя
		sprintf(strForMess, "%cАдреса - %p %p %p %p", 4, str, str + 1, str + 2, str + 3);
		setStatus(@exciterId():32, &strForMess);
		setStatus(V-ADDR, 0);
		++count;
		return;
	}
	 
	if(count == 2) {
		// %d - Десятичное число целого типа со знаком
		u8 value_1 = 55;
		i8 value_2 = -55;
		sprintf(strForMess, "%c%d %d %d %d", 8, 1, -2, value_1, value_2);
		setStatus(@exciterId():32, &strForMess);
		setStatus(V-ADDR, 0);
		++count;
		return;
	}
	 
	if(count == 3) {
		// %i - Десятичное число целого типа со знаком
		u8 value_1 = 22;
		i8 value_2 = -33;
		sprintf(strForMess, "%c%i %i %i %i", 1, 1, -2, value_1, value_2);
		setStatus(@exciterId():32, &strForMess);
		setStatus(V-ADDR, 0);
		++count;
		return;
	}
	 
	if(count == 4) {
		// %е Научная нотация (е нижнего регистра)
		sprintf(strForMess, "%c%e", 4, 3000, 2000);
		setStatus(@exciterId():32, &strForMess);
		setStatus(V-ADDR, 0);
		++count;
		return;
	}
	 
	if(count == 5) {
		// %Е Научная нотация (Е верхнего регистра)
		sprintf(strForMess, "%c%E", 8, 3000, 2000);
		setStatus(@exciterId():32, &strForMess);
		setStatus(V-ADDR, 0);
		++count;
		return;
	}
	 
	if(count == 6) {
		// %о Восьмеричное целое число без знака
		sprintf(strForMess, "%cВосьмеричная система: %o", 1, 10);
		setStatus(@exciterId():32, &strForMess);
		setStatus(V-ADDR, 0);
		++count;
		return;
	}
	 
	if(count == 7) {
		// %u Десятичное число целого типа без знака
		i8 value_1 = 10;
		i8 value_2 = -10;
		sprintf(strForMess, "%c%u %u", 4, value_1, value_2);
		setStatus(@exciterId():32, &strForMess);
		setStatus(V-ADDR, 0);
		++count;
		return;
	}
	 
	if(count == 8) {
		// %х Шестнадцатеричное целое число без знака (буквы нижнего регистра)
		sprintf(strForMess, "%cШестнадцатиричная система lov: 0x%x", 8, 255);
		setStatus(@exciterId():32, &strForMess);
		setStatus(V-ADDR, 0);
		++count;
		return;
	}
	 
	if(count == 9) {
		// %Х Шестнадцатеричное целое число без знака (буквы верхнего регистра)
		sprintf(strForMess, "%cШестнадцатиричная система hi: 0x%X", 1, 255);
		setStatus(@exciterId():32, &strForMess);
		setStatus(V-ADDR, 0);
		++count;
		return;
	}
	 
	if(count == 10) {
		// %% Выводит символ %
		sprintf(strForMess, "%c%%", 4);
		setStatus(@exciterId():32, &strForMess);
		setStatus(V-ADDR, 0);
		++count;
		return;
	}
	 
	if(count == 11) {
		// %c Выводит символы
		u8 val_1 = 0x41; // A
		u8 val_2 = 0x40; // @
		u8 val_3 = 0x55; // U
		u8 *val_4 = "+- %#";
		sprintf(strForMess, "%cСимволы: %c %c %c %c %c %c", 8, val_1, val_2, val_3, val_4[4], 0x67);
		setStatus(@exciterId():32, &strForMess);
		setStatus(V-ADDR, 0);
		count = 0;
		return;
	}
}
}
</item>
<--! Пример 2 -->
<item addr="524:248" name="Тест для функции sprintf" type="script">
u8 count = 0;
V-ID/V-ADDR {
 
if(opt0()) {
// строка для вывода результата в интерфейс
	u8 strForMess[200];
	if(count == 0) {
		// использование width
		u8 *str = "Hello World";
		sprintf(strForMess, "%cwidth со строкой(с и без -): _%20s_ _%-20s_", 1, str, str);
		setStatus(@exciterId():32, &strForMess);
		setStatus(V-ADDR, 0);
		++count;
		return;
	}
	 
	if(count == 1) {
		// использование width
		sprintf(strForMess, "%cwidth с числом(с и без -): _%20d_ _%-20d_", 4, 33, 33);
		setStatus(@exciterId():32, &strForMess);
		setStatus(V-ADDR, 0);
		++count;
		return;
	}
	 
	if(count == 2) {
		// использование width
		sprintf(strForMess, "%cwidth с числом(* с и без -): _%*d_ _%-*d_", 8, 7, 33, 7, 33);
		setStatus(@exciterId():32, &strForMess);
		setStatus(V-ADDR, 0);
		++count;
		return;
	}
	 
	if(count == 3) {
		// флаг #
		sprintf(strForMess, "%cВосьмеричное(%%o) и Шестнадцатеричное(%%x, %%X) без и с флагом #: \10%%o - %o, %#o\10%%x - %x, %#x\10%%X - %X, %#X", 1, 200, 200, 200, 200, 200, 200);
		setStatus(@exciterId():32, &strForMess);
		setStatus(V-ADDR, 0);
		++count;
		return;
	}
	 
	if(count == 4) {
		// precision
		u8 *str = "Hello world";
		sprintf(strForMess, "%c.precision со строкой %s\10%%s - %s\10%%.4s - %.4s", 4, str, str, str);
		setStatus(@exciterId():32, &strForMess);
		setStatus(V-ADDR, 0);
		++count;
		return;
	}
	 
	if(count == 5) {
		// precision
		sprintf(strForMess, "%c.precision с числом %d\10%%d - %d\10%%.6d - %.6d", 8, 43, 43, 43);
		setStatus(@exciterId():32, &strForMess);
		setStatus(V-ADDR, 0);
		++count;
		return;
	}
	 
	if(count == 6) {
		// Флаг +
		i8 val_1 = -33;
		i8 val_2 = 55;
		sprintf(strForMess, "%cФлаг +\10Число -33 с флагом %+d, и без %d.\10Число 55 с флагом %+d, и без %d.", 1, val_1, val_1, val_2, val_2);
		setStatus(@exciterId():32, &strForMess);
		setStatus(V-ADDR, 0);
		count = 0;
		return;
	}
}
}
</item>

Результат выполнения примеров в интерфейс:

Результат примера 1 при последовательном нажатии на элемент script

“Cтрока – Hello World, len = 38″

“Адреса – текущее значение указателей“

“1 -2 55 -55″

“1 -2 22 -33”

“9.881313e-321”

“9.881313E-321”

“Восьмеричная система: 12”

“10 4294967286”

“Шестнадцатиричная система lov: 0xff”

“Шестнадцатиричная система hi: 0xFF”

“%”

“Символы: A @ U # g”

Результат примера 2 при последовательном нажатии на элемент script

“cwidth со строкой(с и без -): _ Hello World_ _ Hello World _”

“width с числом(с и без -): _ 33_ _33 _”

“width с числом(с и без -): _ 33_ _33 _”

 

“Восьмеричное(%o) и Шестнадцатеричное(%x, %X) без и с флагом #:

%o – 310, 0310

%x – c8, 0xc8

%X – C8, 0XC8”

 

“.precision со строкой Hello world

%s – Hello world

%.4s – Hell”

“.precision с числом 43

%d – 43

%.6d – 000043”

“Флаг +

Число -33 с флагом -33, и без -33.

Число 55 с флагом +55, и без 55.”