Есть ли версия 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 при переполнении, вам нужно получить общую длину строки другим способом. Единственный действительно переносимый способ сделать это - начать с буфера некоторого размера, попробовать форматирование и посмотреть, достаточно ли он велик, а если нет, увеличить размер и переформатировать, пока он не станет достаточно большим. Это не очень эффективно, как вы можете себе представить.

Ну, кажется, есть фундаментальный недостаток в ваших ожиданиях. Добавляя это:

  1. Windows имеет то, что вы хотите
  2. У Linux есть неширокий вариант (asprintf не в каком-либо стандарте, но является просто расширением GNU для Linux и * BSD).
  3. POSIX определяет все строки / файлы, связанные с нулевым символом в конце char* массив, который объясняет отсутствие широких версий почти любой функции POSIX.
  4. Помимо 2, 3 и 4, все современные дистрибутивы Linux основаны на UTF-8, что означает, что "широкие версии" - это то, что "предназначено для использования".

Добавление этого дает: зачем вам что-то подобное? Конечно, вы не используете wchar_tты на Unix ты ;), Если да, есть еще два варианта: переключиться на tchar-подобное решение (зависит от платформы typedef) или полностью переключиться на UTF-8.

Другие вопросы по тегам