Перевод double в string с заданной точностью
Есть вот такая функция:
void DoubleToString(std::string &answer_for_return, double answer) {
char *convertator = new char;
sprintf(convertator, "%.7lf", answer);
answer_for_return = convertator;
delete convertator;
}
Делает, то что мне нужно, но в итоге получается утечка. Задавать сразу размер массива символов нельзя, наверное, ведь вдруг ответ будет слишком большой и не влезет.
Ответы (2 шт):
У вас не утечка, а попытка обращения за пределы доступной памяти. Вы можете сначала определить необходимый размер массива символов с помощью функции snprintf, которая принимает вторым параметром размер массива. Вы можете указать его равным нулю - тогда функция ничего не запишет, но вернёт количество символов, которое требуется для записи (не включая \0). Так вы определите, какой размер массива вам нужен. После этого создаёте массив нужной длины и выполняете конвертацию.
Вот пример:
void DoubleToString(std::string &answer_for_return, double answer) {
int count = snprintf(nullptr, 0, "%.7lf", answer);
if (count > 0)
{
char *convertator = new char[count+1];
sprintf(convertator, "%.7lf", answer);
answer_for_return = convertator;
delete convertator;
}
}
int main()
{
std::string s;
double a = 3434.33;
DoubleToString(s, a);
std::cout << s;
return 0;
}
Для преобразования double в string с заданной точностью можно воспользоваться библиотекой <sstream>. Вот пример функции, которая это делает:
#include <sstream>
std::string doubleToString(double number, int precision) {
std::ostringstream stream;
stream.precision(precision);
stream << std::fixed << number;
return stream.str();
}
В этой функции мы используем std::ostringstream для записи числа в строку с заданной точностью. Метод precision устанавливает количество знаков после запятой, а метод std::fixed говорит о том, что нужно выводить фиксированную точку. Функция str() возвращает полученную строку.
Вы можете использовать эту функцию следующим образом:
double value = 3.14159265359;
std::string stringValue = doubleToString(value, 7);
В этом примере мы конвертируем число value в строку с точностью до 7 знаков после запятой и сохраняем результат в stringValue.
Конечно, можно использовать sprintf для преобразования double в string. Вот пример функции:
#include <cstdio>
std::string doubleToString(double number, int precision) {
char buffer[50];
sprintf(buffer, "%.*lf", precision, number);
return std::string(buffer);
}
В этой функции мы используем sprintf, который записывает отформатированные данные в буфер символов buffer. Мы передаем точность как аргумент в метод sprintf и используем .* для динамического задания точности. Затем мы конвертируем буфер в объект std::string и возвращаем его.
Вы можете использовать эту функцию следующим образом:
double value = 3.14159265359;
std::string stringValue = doubleToString(value, 7);
В этом примере мы конвертируем число value в строку с точностью до 7 знаков после запятой и сохраняем результат в stringValue.