#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 в буфере.