#c
#c
Вопрос:
Запутался при попытке исследовать использование snprintf в C . Я вижу, что некоторые онлайн-сайты рекомендуют использовать snprintf поверх sprintf, как показано ниже.
snprintf(str, sizeof(str), "%s", message);
в то время как некоторые онлайн-сообщения требуют дополнительной проверки при использовании snprintf, как показано ниже.
int main(int argc, char *argv[])
{
char buffer[BUF_SIZE];
size_t pos = 0;
int i;
for (i = 0; i < argc; i )
{
int n = snprintf(buffer pos, BUF_SIZE - pos, "%s", argv[i]);
if (n < 0 || n >= BUF_SIZE - pos)
{
break;
}
pos = n;
}
}
Ценю ваши мысли. Спасибо
Комментарии:
1.Независимо от того, безопасно ли это, вы находитесь на C . У вас есть
std::string
. Почему вы не используете это вместо этого, вместо того, чтобы беспокоиться об использовании буферов фиксированного размера сNUL
завершающимися C-строками и вручную настраиваемыми смещениями памяти?std::string buffer;
for (int i = 0; i < argc; i ) { buffer = argv[i]; }
. Нет необходимости вpos
orBUF_SIZE
(вы могли бы использовать его дляreserve
размещения строки большего размера, чтобы избежать перераспределений в обычных случаях, но это не нужно), это просто работает.stringstream
также возможны варианты различных типов.2. Эти «некоторые онлайн» сайты, на которые вы ссылаетесь. Потрудились ли они уточнить свои причины, по которым они говорят вам делать то или иное, или это просто общие, слепые марширующие приказы? Если последнее, могу ли я предложить вам найти лучшую ссылку. В любом случае,
std::ostringsteam
это, как правило, предпочтительная альтернатива в C . Он обрабатывает управление буфером, рост, столько (или мало) форматирования, сколько вы пожелаете, и т.д.3. Когда вы сталкиваетесь с подобным вопросом о коде, вам следует обратиться к документации к рассматриваемой функции, чтобы узнать, что она делает, каковы параметры и значение любого возвращаемого из нее значения.
Ответ №1:
Вместо этого вы должны использовать {fmt} . Это намного безопаснее и проще в использовании. Смотрите этот пример.
#include <fmt/core.h>
int main() {
std::string s = fmt::format("I'd rather be {1} than {0}.", "right", "happy");
fmt::print("{}", s);
}
Эта библиотека в основном стандартизирована в C 20 as std::format
, но стандартные библиотеки пока не поддерживают стандартную версию.