Какая польза от «snprintf» с более чем 4 параметрами?

#c #printf #linux-device-driver

#c #printf #linux-драйвер устройства

Вопрос:

У меня есть кое-что в моем коде, как показано ниже: это код для создания УСТРОЙСТВА в Linux под /dev

 #define PRINTER_STR "printer_"
char str[32];
snprintf(str, sizeof(str), PRINTER_STR "%s%s", dev->type, "%u");
device_create(mycan_drv.class, parent,
              MKDEV(dev->nMajor, dev->nMinor),
              dev, str, dev->nMinor);
  

4-й параметр, snprintf которому dev->type присваивается строка типа epson , hp , canon .

Полученный результат выглядит примерно так: printer_epson32 , printer_hp33 , printer_canon34

В приведенных выше выходных строках я не мог понять, как строятся такие числа, как 32 , 33 , 34 . Я могу понять, что это из-за 5-го параметра, "%u" переданного snprintf . Но как?

Все ссылки, которые я получил, содержат максимум 3 или 4 параметра snprintf . Пожалуйста, помогите.

Комментарии:

1. Вы пытались прочитать страницу руководства? snprintf

2. Вы могли бы сделать: device_create(mycan_drv.class, parent, MKDEV(dev->nMajor, dev->nMinor), dev, PRINTER_STR "%s%u", dev->type, dev->nMinor); .

Ответ №1:

 char str[32];
dev->type = "epson";
snprintf(str, sizeof(str), "printer_" "%s%s", dev->type, "%u");
  

приводит к:

 str = "printer_epson%u".
  

Тогда код выполняет:

 device_create(..., str, dev->nMinor);
  

что на самом деле:

 device_create(..., "printer_epson%u", dev->nMinor);
  

а затем внутри снова вызывается device_create *printf подобная функция, и она записывает dev->nMinor вместо %u . Так, например, это не snprintf то, что записывает число, число записывается внутри device_create . snprintf используется для создания строки форматирования для device_create и device_create записывает это число.

Примечание сбоку: "%s%s", dev->type, "%u") Выглядит странно, это могло быть просто "%s%%u", dev->type); . И в любом случае, несмотря на все, что это могло быть device_create(...., "%s%u", dev->type, dev->nMinor) .

Комментарии:

1. Спасибо @KamilCuk, ваше объяснение было аккуратным и ясным. Это было полезно.

Ответ №2:

Проще было бы:

 snprintf(str, sizeof(str), PRINTER_STR "%s%%u", dev->type);
  

Поскольку %u является фиксированной строкой, она может быть просто включена в формат. % Необходимо экранировать, чтобы избежать интерпретации snprintf.