_fcvt_s преобразование значения 0 в строку

#c #converters

Вопрос:

Когда я искал ошибку в старом проекте C , я пришел к (для меня) странному поведению функции _fcvt для преобразования двойника в строку

 int decPos, isNeg;
char buffer[100];

_fcvt_s(buffer, sizeof(buffer), 0.0000, 2, amp;decPos, amp;isNeg);  // buffer == "00"
_fcvt_s(buffer, sizeof(buffer), 1.0000, 2, amp;decPos, amp;isNeg);  // buffer == "100"
 

Я ожидал бы, что первый вызов _fcvt заполнит буфер «000» вместо «00».

Это вызвало ошибку, которую я искал.
Является ли это ошибкой в _fcvt (например, вызванной операционной системой или региональными настройками) или это намеренно?
Я использую последние версии Windows 10 и VS2019

Обходной путь прост, если опустить эту функцию:

 double val = 0.0;
int numDec = 2;

std::ostringstream sout;
sout << std::setprecision(numDec) << std::fixed << val;
string test = sout.str();  //0.00
 

Комментарии:

1. После прочтения документации такое поведение имеет для меня смысл, хотя я никогда не использовал эту функцию и, вероятно, никогда не буду использовать. Я бы предположил decPos , что это 0 для первой строки и 1 для второй.

Ответ №1:

Поведение является правильным в соответствии с руководством.

Нулевое или отрицательное целое значение указывает на то, что десятичная точка находится слева от первой цифры.

Проверьте десятичную позицию в decPos . Если это 0, то вы получите .00, что является правильным 00 в буфере.