Конвертировать double в строку C++?
Возможный дубликат:
Как я могу преобразовать двойной в строку в C++?
Я хочу объединить строку и двойное число, и g ++ выдает эту ошибку:
main.cpp: в функции 'int main()':
main.cpp: 40: ошибка: недопустимые операнды типов "const char [2]" и "double" для двоичного "оператора +"
Вот строка кода, на которую она выдает ошибку:
storeCorrect[count] = "("+c1+","+c2+")";
Хранимый [правильный] - строковый массив, а c1 и c2 - двойные. Есть ли способ конвертировать c1 и c2 в строки, чтобы моя программа правильно компилировалась?
5 ответов
Вы не можете сделать это напрямую. Есть несколько способов сделать это:
Использовать
std::stringstream
:std::ostringstream s; s << "(" << c1 << ", " << c2 << ")"; storedCorrect[count] = s.str()
использование
boost::lexical_cast
:storedCorrect[count] = "(" + boost::lexical_cast<std::string>(c1) + ", " + boost::lexical_cast<std::string>(c2) + ")";
использование
std::snprintf
:char buffer[256]; // make sure this is big enough!!! snprintf(buffer, sizeof(buffer), "(%g, %g)", c1, c2); storedCorrect[count] = buffer;
Существует множество других способов, использующих различные функции преобразования в строку, но это основные способы, которыми вы увидите, как это делается.
В C++11 используйтеstd::to_string
если вы можете принять формат по умолчанию (%f
).
storedCorrect[count]= "(" + std::to_string(c1) + ", " + std::to_string(c2) + ")";
Использование std::stringstream
, это operator <<
перегружен для всех встроенных типов.
#include <sstream>
std::stringstream s;
s << "(" << c1 << "," << c2 << ")";
storedCorrect[count] = s.str();
Это работает так, как вы ожидаете - так же, как вы печатаете на экран с std::cout
, Вместо этого вы просто "печатаете" строку. Внутренние органы operator <<
позаботьтесь о том, чтобы было достаточно места и делали все необходимые преобразования (например, double
в string
).
Кроме того, если у вас есть библиотека Boost, вы можете рассмотреть lexical_cast
, Синтаксис очень похож на обычные приведения в стиле C++:
#include <string>
#include <boost/lexical_cast.hpp>
using namespace boost;
storedCorrect[count] = "(" + lexical_cast<std::string>(c1) +
"," + lexical_cast<std::string>(c2) + ")";
Под капотом, boost::lexical_cast
в основном делает то же самое, что мы сделали с std::stringstream
, Основным преимуществом использования библиотеки Boost является то, что вы можете пойти другим путем (например, string
в double
) так же легко. Нет больше возиться с atof()
или же strtod()
и необработанные строки в стиле C
std::string stringify(double x)
{
std::ostringstream o;
if (!(o << x))
throw BadConversion("stringify(double)");
return o.str();
}
C++ FAQ: http://www.parashift.com/c++-faq-lite/misc-technical-issues.html
Я считаю, что sprintf - это то, что вам нужно. Я в стандартной библиотеке, как printf. Перейдите по ссылке ниже для получения дополнительной информации: