Конвертировать double в строку C++?

Возможный дубликат:
Как я могу преобразовать двойной в строку в C++?

Я хочу объединить строку и двойное число, и g ++ выдает эту ошибку:

main.cpp: в функции 'int main()':
main.cpp: 40: ошибка: недопустимые операнды типов "const char [2]" и "double" для двоичного "оператора +"

Вот строка кода, на которую она выдает ошибку:

storeCorrect[count] = "("+c1+","+c2+")";

Хранимый [правильный] - строковый массив, а c1 и c2 - двойные. Есть ли способ конвертировать c1 и c2 в строки, чтобы моя программа правильно компилировалась?

5 ответов

Вы не можете сделать это напрямую. Есть несколько способов сделать это:

  1. Использовать std::stringstream:

    std::ostringstream s;
    s << "(" << c1 << ", " << c2 << ")";
    storedCorrect[count] = s.str()
    
  2. использование boost::lexical_cast:

    storedCorrect[count] = "(" + boost::lexical_cast<std::string>(c1) + ", " + boost::lexical_cast<std::string>(c2) + ")";
    
  3. использование 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. Перейдите по ссылке ниже для получения дополнительной информации:

http://www.cplusplus.com/reference/clibrary/cstdio/sprintf/

Другие вопросы по тегам