Есть ли версия wchar_t для asprintf?
Мне нужна функция C, которая возвращает окончательную длину отформатированной строки, чтобы я мог правильно распределить целевую строку, а не сам вычислять длину. Есть snprintf
который делает это только при невозможности написать всю строку, но, к сожалению, для него нет широкой альтернативы char.
swprintf
в случае ошибки возвращает -1, а не необходимую длину (почему не то же самое поведение?!?)
Название упомянуто asprintf
Кажется, также не поможет, так как он предоставляет только неширокую версию.
_vscwprintf
может использоваться в Windows, но мне нужна кроссплатформенная, стандартная версия или хотя бы версия Linux, и я #ifdef код.
Есть идеи? Спасибо!
3 ответа
POSIX 2008 добавил open_wmemstream
функция, которая наряду с vfwprintf
делает именно то, что вам нужно. Ранее это было расширение GNU, поэтому оно было доступно в системах GNU в течение длительного времени.
Это можно легко использовать для построения awprintf
обертка.
Да, swprintf
, Обратите внимание, что, несмотря на его название, swprintf
является широким символом эквивалента snprintf
не sprintf
тем, что он принимает размер буфера в качестве второго параметра; (к счастью) нет широкоформатной версии, которая не принимает размер буфера.
Кроме того, так как он возвращает -1 при переполнении, вам нужно получить общую длину строки другим способом. Единственный действительно переносимый способ сделать это - начать с буфера некоторого размера, попробовать форматирование и посмотреть, достаточно ли он велик, а если нет, увеличить размер и переформатировать, пока он не станет достаточно большим. Это не очень эффективно, как вы можете себе представить.
Ну, кажется, есть фундаментальный недостаток в ваших ожиданиях. Добавляя это:
- Windows имеет то, что вы хотите
- У Linux есть неширокий вариант (
asprintf
не в каком-либо стандарте, но является просто расширением GNU для Linux и * BSD). - POSIX определяет все строки / файлы, связанные с нулевым символом в конце
char*
массив, который объясняет отсутствие широких версий почти любой функции POSIX. - Помимо 2, 3 и 4, все современные дистрибутивы Linux основаны на UTF-8, что означает, что "широкие версии" - это то, что "предназначено для использования".
Добавление этого дает: зачем вам что-то подобное? Конечно, вы не используете wchar_t
ты на Unix ты ;)
, Если да, есть еще два варианта: переключиться на tchar
-подобное решение (зависит от платформы typedef) или полностью переключиться на UTF-8.