2009-07-14 3 views
27

Possible Duplicate:
How do I convert a double into a string in C++?Преобразование double в строку C++?

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

main.cpp: В функции 'INT основной()':
main.cpp: 40: ошибка: недействительные операнды 'сопзЬ полукокса [2] Типы и «двойной» на двоичный «оператор +»

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

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

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

+11

Как насчет некоторых примеров из следующих источников: http://www.codeproject.com/KB/recipes/Tokenizer.aspx Они очень эффективны и несколько элегантны. – 2010-11-02 05:03:53

+0

http://stackoverflow.com/q/29200635/395461 – Shannon

ответ

22

Использование 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.

+0

На самом деле 'boost :: lexical_cast' не использует' std :: stringstream' под капотом. Он реализует свои собственные процедуры преобразования, которые значительно быстрее, чем использование 'stringstream', и в большинстве случаев быстрее, чем' scanf'/'printf'. Смотрите: http://www.boost.org/doc/libs/1_48_0/doc/html/boost_lexical_cast/performance.html – Ferruccio

+0

Источник для 'lexical_cast' сильно отличается от того, когда я его видел в последний раз. Похоже, что они значительно улучшили производительность в прошлых версиях Boost. Это еще больше поводов для этого, если можно. –

71

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

  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; 
    

Существует множество других способов, используя различные функции преобразования двух строк в строку, но это основные способы, по которым вы это увидите.

+4

Я знаю, что этот ответ старый, но вы также можете включить 'std :: string to_string (double);' здесь. – JohnJohn

1

Я считаю, что sprintf - это правильная функция для вас. Я в стандартной библиотеке, например, printf.Перейдите по ссылке ниже для получения дополнительной информации:

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

+8

'sprintf' небезопасно для форматирования чисел, поскольку он не выполняет никаких проверок границ в выходном буфере, и нет хорошего портативного способа определения размера буфера, который был бы безопасен для любого значения' double'. –

+0

Ну в этом случае используйте 'snprintf' :) Но, действительно, предсказать необходимый размер буфера может быть трудным. – tomsmeding

26

В C++ 11, use std::to_string если вы можете принять формат по умолчанию (%f).

storedCorrect[count]= "(" + std::to_string(c1) + ", " + std::to_string(c2) + ")";