sprintf в C/C++: форматирование строк

Привет! 👋 В этой статье речь пойдет о функции sprintf. Эта функция очень похожа на printf (советую почитать, если вы c ней не знакомы), лишь с тем отличием, что строку она не выводит на экран, а записывает по переданной ей ссылке.

В начале, мы посмотрим какие параметры sprintf принимает и какое значение возвращает. Потом, мы посмотрим на несколько примеров использования этой функции. А закрепить изученное нам помогут упражнения в конце статьи.

Как отформатировать строку используя sprintf

Функция sprintf доступна нам после подключения библиотеки <stdio.h>. Она позволяет отформатировать строку используя такой же формат как и в функции printf. Давайте посмотрим на сигнатуру этой функции:

int sprintf ( char * str, const char * format, ... );
  • Первым аргументом функция принимает адрес в памяти, куда будет записана отформатированная строка.
  • Вторым аргументом мы указываем строку форматирования. Этот и следующие аргументы совпадают с аргументами функции printf.
  • Далее мы передаем столько дополнительных параметров, сколько требуется для отформатированной строки. Можно передать больше, но не меньше.
  • Возвращает функция количество символов записанных по адресу str (первый аргумент). Символ окончания строки \0 не учитывается в результате, хотя записан в конце строки будет.

Теперь давайте посмотри на пример использования sprintf:

#include <stdio.h>

int main() {
  char s[10];
  int a = 1;
  int b = 2;
  int n = sprintf(s, "%d + %d = %d", a, b, a + b);

  printf("s = \"%s\", n = %d \n", s, n);

  return 0;
}

Вывод этой программы:

s = "1 + 2 = 3", n = 9 
  1. Начинаем мы с объявления строки s на десять символов. Важно, чтобы результат работы sprintf влез в эту переменную. Если отформатированная строка получится слишком большой, то программа может себя повести неопределенным образом.
  2. Далее для удобства мы объявляем две переменные a и b Мы будем их использовать для демонстрации форматирования строки.
  3. Теперь мы вызываем функцию sprintf и записываем результат ее работы в переменную n.
  4. В конце мы выводим переменные s и n на экран. Здесь вы можете убедиться, что строка действительно состоит из девяти символов и отформатирована верно.

Что будет выведено на экран?

#include <stdio.h>

int main() {
  char s[20];
  int a = 100;
  int b = 200;
  int n = sprintf(s, "%d + %d = %d", a, b, a + b);

  printf("s = \"%s\", n = %d \n", s, n);

  return 0;
}
s = “100 + 200 = 300”, n = 15
s = “100 + 200 = 300”, n = 16
s = “100 + 200 = 300”, n = 20
s = “100 + 200 =”, n = 16

Упражнения

  1. Использование sprintf для форматирования даты:
    Напишите программу на C++, которая запрашивает у пользователя день, месяц и год, а затем использует функцию sprintf для форматирования этой даты в строку формата dd-mm-yyyy. Ваша программа должна выводить исходные данные и отформатированную строку.

  2. Создание своей версии sprintf для форматирования целых чисел:
    Создайте свою версию функции sprintf, которая принимает строку, в которую будет записан результат, форматную строку и два целых числа. Ваша функция должна поддерживать спецификаторы формата %d и %i. Проверьте работу вашей функции, используя различные числа.

  3. Обработка ошибок при использовании sprintf:
    Напишите программу, которая демонстрирует, что происходит, если буфер, переданный в sprintf, оказывается слишком мал для отформатированной строки. В вашей программе должны быть использованы функция sprintf и буфер недостаточного размера, и результаты работы функции должны выводиться на экран.

Обсуждение