Модуль stdio.h предоставляет стандартные функции языка C (компилятор GCC) для работы с вводом-выводом, включая форматированный вывод строк в стандартный поток вывода, строки или буферы памяти, а также вывод отдельных символов и строк. Функции поддерживают форматирование с использованием спецификаторов формата, аналогичных тем, что используются в языке C.

Для работы с модулем stdio.h реализованы следующие функции:

  // Форматированный вывод
int printf(const char *format, ...);
int vprintf(const char *format, va_list ap);
int sprintf(char *str, const char *format, ...);
int snprintf(char *str, size_t size, const char *format, ...);
int vsprintf(char *str, const char *format, va_list ap);
int vsnprintf(char *str, size_t size, const char *format, va_list ap);

// Вывод символов и строк
int putchar(int c);
int puts(const char *s);
  

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

Функции форматированного вывода (printf, vprintf, sprintf, snprintf, vsprintf, vsnprintf) используют строку формата format, которая может содержать спецификаторы формата. Основные спецификаторы:

  • %d, %i — целое число со знаком (int).
  • %u — целое число без знака (unsigned int).
  • %f — число с плавающей точкой (float или double).
  • %s — строка (нуль-терминированная).
  • %c — символ (char).
  • %p — указатель (в шестнадцатеричном формате).
  • %% — символ процента.

Дополнительные модификаторы:

  • Число (например, %10d) — минимальная ширина поля.
  • Точка и число (например, %.2f) — точность (количество знаков после запятой для чисел с плавающей точкой).
  • 0 (например, %08d) — заполнение нулями слева.
  • - (например, %-10s) — выравнивание по левому краю.

printf

Функция int printf(const char *format, ...) выводит форматированную строку в стандартный поток вывода (обычно консоль).

Параметры:

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

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

  • Количество выведенных символов (без учета завершающего нуль-символа) или отрицательное значение при ошибке.

Пример использования:

  #include <stdio.h>

int main(void) {
    int num = 42;
    float val = 3.14159;
    const char *str = "world";
    int res = printf("Number: %d, Float: %.2f, String: %s\n", num, val, str);
    printf("Выведено символов: %d\n", res); // Ожидается: Number: 42, Float: 3.14, String: world
                                             // Выведено символов: 33
    return 0;
}
  

vprintf

Функция int vprintf(const char *format, va_list ap) выводит форматированную строку в стандартный поток вывода, используя список аргументов va_list.

Параметры:

  • format — строка формата.
  • ap — список аргументов, созданный с использованием va_start и va_end (из <stdarg.h>).

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

  • Количество выведенных символов или отрицательное значение при ошибке.

Пример использования:

  #include <stdio.h>
#include <stdarg.h>

void print_formatted(const char *format, ...) {
    va_list args;
    va_start(args, format);
    int res = vprintf(format, args);
    va_end(args);
    printf("\nВыведено символов: %d\n", res);
}

int main(void) {
    print_formatted("Number: %d, String: %s\n", 42, "world");
    // Ожидается: Number: 42, String: world
    // Выведено символов: 22
    return 0;
}
  

sprintf

Функция int sprintf(char *str, const char *format, ...) записывает форматированную строку в буфер str, включая завершающий нуль-символ.

Параметры:

  • str — указатель на буфер назначения (должен быть достаточно большим).
  • format — строка формата.
  • ... — переменное количество аргументов.

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

  • Количество записанных символов (без учета нуль-символа) или отрицательное значение при ошибке.

Примечание: Не проверяет размер буфера, что может привести к переполнению. Рекомендуется использовать snprintf.

Пример использования:

  #include <stdio.h>

int main(void) {
    char buf[50];
    int num = 42;
    int res = sprintf(buf, "Number: %d", num);
    printf("Результат: %s, символов: %d\n", buf, res); // Ожидается: Результат: Number: 42, символов: 10
    return 0;
}
  

snprintf

Функция int snprintf(char *str, size_t size, const char *format, ...) записывает не более size символов форматированной строки в буфер str, включая завершающий нуль-символ.

Параметры:

  • str — указатель на буфер назначения.
  • size — максимальное количество записываемых символов (включая нуль-символ).
  • format — строка формата.
  • ... — переменное количество аргументов.

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

  • Количество символов, которые были бы записаны при достаточно большом буфере (без учета нуль-символа), или отрицательное значение при ошибке.

Пример использования:

  #include <stdio.h>

int main(void) {
    char buf[10];
    int num = 123456;
    int res = snprintf(buf, sizeof(buf), "Number: %d", num);
    printf("Результат: %s, символов: %d\n", buf, res); // Ожидается: Результат: Number: 1, символов: 11
    return 0;
}
  

vsprintf

Функция int vsprintf(char *str, const char *format, va_list ap) записывает форматированную строку в буфер str, используя список аргументов va_list.

Параметры:

  • str — указатель на буфер назначения.
  • format — строка формата.
  • ap — список аргументов.

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

  • Количество записанных символов (без учета нуль-символа) или отрицательное значение при ошибке.

Примечание: Небезопасна из-за отсутствия проверки размера буфера. Рекомендуется использовать vsnprintf.

Пример использования:

  #include <stdio.h>
#include <stdarg.h>

void format_string(char *buf, const char *format, ...) {
    va_list args;
    va_start(args, format);
    int res = vsprintf(buf, format, args);
    va_end(args);
    printf("Результат: %s, символов: %d\n", buf, res);
}

int main(void) {
    char buf[50];
    format_string(buf, "Value: %d", 42);
    // Ожидается: Результат: Value: 42, символов: 9
    return 0;
}
  

vsnprintf

Функция int vsnprintf(char *str, size_t size, const char *format, va_list ap) записывает не более size символов форматированной строки в буфер str, используя список аргументов va_list.

Параметры:

  • str — указатель на буфер назначения.
  • size — максимальное количество записываемых символов (включая нуль-символ).
  • format — строка формата.
  • ap — список аргументов.

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

  • Количество символов, которые были бы записаны при достаточно большом буфере (без учета нуль-символа), или отрицательное значение при ошибке.

Пример использования:

  #include <stdio.h>
#include <stdarg.h>

void format_string(char *buf, size_t size, const char *format, ...) {
    va_list args;
    va_start(args, format);
    int res = vsnprintf(buf, size, format, args);
    va_end(args);
    printf("Результат: %s, символов: %d\n", buf, res);
}

int main(void) {
    char buf[10];
    format_string(buf, sizeof(buf), "Value: %d", 123456);
    // Ожидается: Результат: Value: 12, символов: 10
    return 0;
}
  

putchar

Функция int putchar(int c) выводит символ c в стандартный поток вывода.

Параметры:

  • c — символ для вывода (передается как int, но интерпретируется как unsigned char).

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

  • Код выведенного символа или EOF при ошибке.

Пример использования:

  #include <stdio.h>

int main(void) {
    int res = putchar('A');
    printf("\nВыведен символ с кодом: %d\n", res); // Ожидается: A
                                                          // Выведен символ с кодом: 65
    return 0;
}
  

puts

Функция int puts(const char *s) выводит строку s в стандартный поток вывода, добавляя символ новой строки (\n).

Параметры:

  • s — указатель на нуль-терминированную строку.

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

  • Неотрицательное значение при успехе или EOF при ошибке.

Пример использования:

  #include <stdio.h>

int main(void) {
    const char *s = "Hello, world!";
    int res = puts(s);
    printf("Результат: %d\n", res); // Ожидается: Hello, world!
                                   // Результат: неотрицательное значение
    return 0;
}