Должен ли я использовать wsprintf() для печати двойника в виде широкой строки?

Я не могу напечатать значение double, используя wsprintf(). Я пробовал sprintf(), и он работал нормально.

Синтаксис, используемый для wsprintf() и sprintf(), выглядит следующим образом:

wsprintf(str,TEXT("Square is %lf "),iSquare); // Does not show value

sprintf(str," square is %lf",iSquare);  // works okay

Могу ли я ошибаться при использовании wsprintf()?

Ответ 1

wsprintf не поддерживает с плавающей запятой. Ошибка заключается в ее использовании.

Если вы хотите что-то вроде sprintf, но для широких символов/строк вы хотите использовать swprintf.

На самом деле, поскольку вы используете макрос TEXT, вам, скорее всего, понадобится _stprintf: он будет переходить от узкой к широкой реализации в синхронизации с теми же макросами препроцессора, что и TEXT чтобы решить, будет ли строка узкой или широкой. Однако весь этот подход в значительной степени является реликтом со времен, когда Microsoft все еще продавала и поддерживала версии Windows на основе как 32-битного ядра NT, так и 16-битного ядра. В 16-разрядные версии имели только крайне минимальную поддержку широких символов, так что Microsoft упорно работала на разрешение единой исходного кода базы для компиляции использовать либо узкие символы (таргетинг 16-битные ядра) или широкие символы (целевые 32-разрядный ядра). 16-разрядные ядра пропали достаточно долго, и почти никто не имеет повода для их поддержки.

Для чего это стоит: wsprintf почти полностью историческая реликвия. Очевидно, что w означает Windows. Он был включен как часть Windows назад, когда (обратно в 16-битные дни). Он был написан без поддержки плавающей запятой, потому что в то время Windows не использовала плавающей запятой внутри - это часть того, почему у нее есть подпрограммы, такие как MulDiv, даже если делать (примерно) то же самое с плавающей запятой довольно тривиальным.

Ответ 2

wsprintf не поддерживает с плавающей запятой. См. Документацию - lf не указан в качестве допустимого формата.

Функциональная часть swprintf стандартной библиотеки Visual Studio - это то, что вы хотите. Он поддерживает все коды формата, которые sprintf делает.

Ответ 3

Функция wsprintf() не поддерживает параметры с плавающей запятой, вместо этого используйте swprintf(), если вы работаете с значениями с плавающей запятой.

Более подробную информацию о swprint можно найти здесь

Ответ 4

Предположительно, вы не скомпилированы в UNICODE, а TEXT # определен как обычная строка.