Модуль stdio.h
Ввод-вывод, форматирование текста
#include <stdio.h> предоставляет форматирование строк и вывод в кольцевую консоль сценария. Это функции прошивки; stdout не является файлом или терминалом ОС. Файловые функции, scanf/getchar и stdin в текущем заголовке отсутствуют.
Форматы и размер
Используются обычные спецификаторы C: %d/%i для int, %u для unsigned int, %ld/%lu для long, %lld/%llu для long long, %f для double (float продвигается до double), %s для нуль-терминированной строки, %c, %p и %%. Например, %08x задаёт ширину и ведущие нули, %.2f — два знака после запятой. Тип аргумента должен соответствовать формату.
Размеры — в байтах, включая байты UTF-8, а не в числе видимых символов. Итоговая консоль ограничена кольцевым буфером (1024 байта в проверенной прошивке для X0); при заполнении старые данные вытесняются. Текущий текст доступен в веб-интерфейсе и через /txt?out.
printf
int printf(const char *format, ...);
Форматирует текст во временный буфер и передаёт в консоль не больше 127 байт за вызов. Длинный результат усекается, но возвращаемое значение — полная длина, которую сформировал бы formatter, без завершающего нуля. Отрицательный результат означает ошибку форматирования. Усечение возможно внутри многобайтного символа UTF-8; длинные строки выводите отдельными короткими фрагментами.
Например, printf("%0500d", 1) возвращает 500 и передаёт в консоль первые 127 байт. Это отличается от обычного неограниченного stdout настольного C.
vprintf
int vprintf(const char *format, va_list ap);
Аналог printf с тем же ограничением 127 байт и полной возвращаемой длиной. Принимает обычный va_list, а не указатель на него. Создавайте список с va_start и завершайте va_end; для повторного использования требуется отдельная копия va_copy.
#include <stdio.h>
#include <stdarg.h>
static int print_values(const char *format, ...) {
va_list arguments;
va_start(arguments, format);
int result = vprintf(format, arguments);
va_end(arguments);
return result;
}
int main(void) {
print_values("Value: %d; %s\n", 42, "ready");
return 0;
}
sprintf
int sprintf(char *str, const char *format, ...);
Записывает текст и завершающий ноль в str, не зная размера буфера. Возвращает длину без нуля либо отрицательное значение при ошибке. Буфер должен вмещать результат целиком. Ограничение printf в 127 байт сюда не относится; для ограниченного буфера используйте snprintf.
snprintf
int snprintf(char *str, size_t size, const char *format, ...);
Записывает не больше size-1 байт текста и ноль при size>0. Возвращает длину, которая требовалась бы без усечения; result >= size означает нехватку места, result < 0 — ошибку. size включает место для нуля. При size=0 запись не производится, для вычисления требуемой длины допустим NULL в str.
#include <stdio.h>
int main(void) {
char buffer[32];
int length = snprintf(buffer, sizeof(buffer), "Value: %.2f", 3.14159);
if (length < 0 || (size_t)length >= sizeof(buffer)) {return 1;}
puts(buffer);
return 0;
}
vsprintf
int vsprintf(char *str, const char *format, va_list ap);
Аналог sprintf с va_list. Не проверяет размер. Сам по себе va_list не делает запись безопасной; для ограниченного буфера предпочтителен vsnprintf.
vsnprintf
int vsnprintf(char *str, size_t size, const char *format, va_list ap);
Аналог snprintf с va_list. Возвращает полную требуемую длину; правила нулевого размера и усечения такие же. Это не вывод в консоль — результат остаётся в переданном буфере.
putchar
int putchar(int c);
Добавляет младший байт c в консоль. В текущей реализации возвращает позицию конца кольцевого буфера, а не напечатанный символ, как требует стандартная функция C. Не используйте результат как значение символа или стандартный EOF-контракт.
puts
int puts(const char *s);
Передаёт строку и добавляет \n. Ограничение formatter в 127 байт не применяется, но запись строки длиннее полного буфера stdout в текущей реализации пропускается; добавление новой строки остаётся. Для длинных данных делите вывод на короткие части.
Возвращает результат внутреннего putchar для \n, то есть позицию в кольцевом буфере, а не количество напечатанных байт. NULL вместо строки недопустим.