Я думаю, что я где-то читал, что если передать значение nullptr в std::strftime, функция вернет необходимый размер буфера. И действительно, следующий код работает отлично на многочисленных системы Linux, которые я пробовал его (не при компиляции с VS, хотя):Возвращаемое значение std :: strftime
#include <iostream>
#include <ctime>
#include <string>
int main()
{
std::time_t time{};
std::tm const * ltime = std::localtime(&time);
const char * formatString = "%Y-%b-%d";
//allocate buffer of appropriate size
auto requiredSize = 1 + std::strftime(nullptr, 50, formatString, ltime);
std::cout << "Required buffer size:" << requiredSize << "\n";
//Format time to string
std::string buff(requiredSize, ' ');
std::strftime(&buff[0], requiredSize, formatString, ltime);
std::cout << buff << std::endl;
}
Однако я не смог найти свой оригинал или любую другую документацию, будет определять это поведение. Поэтому мой вопрос:
- В каких системах/компиляторах/реализациях стандартной библиотеки (если есть) это гарантированное поведение?
- Где я могу найти соответствующую документацию?
Edit: Я добавил метку C, как я видел один и тот же результат с эквивалентным кодом C и, по крайней мере с GCC/г ++ (или, скорее, Glibc/libstdC++) std::strftime
, вероятно, просто псевдоним для c- функция strftime
в любом случае.
IIRC, что вы утверждаете, работает. Я думаю, что cppreference нуждается в обновлении об этом. –
Документация: посмотрите один из черновиков для последнего стандарта C++. Он документирует функции библиотеки (но, возможно, ссылаясь на стандарт C). Обратите внимание, что существует общее правило: «вы не можете передавать NULL в библиотечную функцию, если только это явно не говорит». –
@ πάνταῥεῖ: Дело в том, что ни в стандарте C, ни в C++ (по крайней мере, в версиях, которые я могу найти в Интернете) я могу найти любую ссылку на это. И в соответствующих man-страницах на linux-системах я его тестировал. – MikeMB