2009-07-14 46 views
27

Possible Duplicate:
How do I convert a double into a string in C++?Chuyển đổi gấp đôi thành chuỗi C++?

Tôi muốn kết hợp một chuỗi và một ++ đôi và g được ném lỗi này:

main.cpp: Trong chức năng 'int main()':
main.cpp: 40: lỗi: toán hạng không hợp lệ của 'const char [2]' loại và 'đôi' để nhị phân 'operator +'

đây là dòng mã mà nó được ném các lỗi trên:

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

savedCorrect [] là một mảng chuỗi, và c1 và c2 đều là gấp đôi. Có cách nào để chuyển đổi c1 và c2 để dây để cho phép chương trình của tôi để biên dịch một cách chính xác?

+11

Làm thế nào về một số ví dụ sau đây: http://www.codeproject.com/KB/recipes/Tokenizer.aspx Chúng rất hiệu quả và phần nào thanh lịch. –

+0

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

Trả lời

22

Sử dụng std::stringstream. operator << của nó bị quá tải cho tất cả các loại tích hợp sẵn.

#include <sstream>  

std::stringstream s; 
s << "(" << c1 << "," << c2 << ")"; 
storedCorrect[count] = s.str(); 

Điều này hoạt động giống như bạn mong đợi - giống như cách bạn in trên màn hình với std::cout. Bạn chỉ đơn giản là "in" vào một chuỗi thay thế. Nội bộ của operator << đảm bảo có đủ dung lượng và thực hiện bất kỳ chuyển đổi cần thiết nào (ví dụ: double đến string).

Ngoài ra, nếu bạn có thư viện Boost, bạn có thể cân nhắc xem xét lexical_cast. Cú pháp trông giống như C++ bình thường - phong cách phôi:

#include <string> 
#include <boost/lexical_cast.hpp> 
using namespace boost; 

storedCorrect[count] = "(" + lexical_cast<std::string>(c1) + 
         "," + lexical_cast<std::string>(c2) + ")"; 

Dưới mui xe, boost::lexical_cast về cơ bản là làm điều tương tự, chúng tôi đã làm với std::stringstream. Một lợi thế quan trọng để sử dụng thư viện Boost là bạn có thể đi theo cách khác (ví dụ: string đến double) cũng dễ dàng. Không còn lộn xộn với atof() hoặc strtod() và các chuỗi kiểu C thô.

+0

Thực ra, 'boost :: lexical_cast' không sử dụng' std :: stringstream' dưới mui xe. Nó thực hiện các thói quen chuyển đổi của riêng nó nhanh hơn đáng kể so với việc sử dụng 'stringstream' và trong hầu hết các trường hợp nhanh hơn' scanf'/'printf'. Xem: http://www.boost.org/doc/libs/1_48_0/doc/html/boost_lexical_cast/performance.html – Ferruccio

+0

Nguồn cho 'lexical_cast' trông khác nhiều so với lần cuối tôi nhìn thấy nó. Có vẻ như họ đã cải thiện hiệu suất đáng kể trong vài bản phát hành Boost trước đây. Đó là lý do thậm chí nhiều hơn để đi với nó nếu bạn có thể. –

71

Bạn không thể thực hiện trực tiếp. Có một số cách để làm điều đó:

  1. Sử dụng một std::stringstream:

    std::ostringstream s; 
    s << "(" << c1 << ", " << c2 << ")"; 
    storedCorrect[count] = s.str() 
    
  2. Sử dụng boost::lexical_cast:

    storedCorrect[count] = "(" + boost::lexical_cast<std::string>(c1) + ", " + boost::lexical_cast<std::string>(c2) + ")"; 
    
  3. Sử dụng std::snprintf:

    char buffer[256]; // make sure this is big enough!!! 
    snprintf(buffer, sizeof(buffer), "(%g, %g)", c1, c2); 
    storedCorrect[count] = buffer; 
    

Có một số cách khác, sử dụng các hàm chuyển đổi hai chuỗi khác nhau, nhưng đây là những cách chính bạn sẽ thấy nó được thực hiện.

+4

Tôi biết câu trả lời này là cũ, nhưng bạn cũng có thể muốn bao gồm 'std :: string to_string (double);' ở đây. – JohnJohn

1

Tôi tin rằng sprintf là chức năng phù hợp với bạn. Tôi đang ở trong thư viện chuẩn, như printf.Thực hiện theo các liên kết dưới đây để biết thêm thông tin:

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

+8

'sprintf' không an toàn cho định dạng số, vì nó không kiểm tra giới hạn trên bộ đệm đầu ra, và không có cách di động tốt để xác định kích thước của bộ đệm sẽ an toàn cho bất kỳ giá trị' double' nào. –

+0

Trong trường hợp đó, sử dụng 'snprintf' :) Nhưng thực sự, việc dự đoán kích thước bộ đệm cần thiết có thể khó khăn. – tomsmeding

26

Trong C++ 11, use std::to_string nếu bạn có thể chấp nhận các định dạng mặc định (%f).

storedCorrect[count]= "(" + std::to_string(c1) + ", " + std::to_string(c2) + ")"; 
Các vấn đề liên quan