2012-04-18 72 views
28

Tôi đang cố gắng làm điều gì đó rất đơn giản, nhưng sau một giờ tìm kiếm một câu trả lời phù hợp, tôi không thể tìm thấy một điều gì đó hiển nhiên.C++ tạo chuỗi văn bản và biến

Tôi đang cố gắng tạo động tên tệp để sử dụng với ifstream. Trong khi tôi hiểu các phương thức khác nhau có sẵn để thực hiện việc này, tôi đã giải quyết việc tạo một chuỗi std :: và sử dụng stringname.c_str để chuyển đổi thành const.

Tuy nhiên, vấn đề là tôi cần phải tạo chuỗi bằng cách kết hợp các biến và giá trị văn bản được xác định trước. Tôi nhận được lỗi trình biên dịch, vì vậy đây phải là một vấn đề cú pháp.

Pseudo

std::string var = "sometext" + somevar + "sometext" + somevar; 

Cảm ơn!

+4

nếu đó là cú pháp sai hoặc bạn nên đăng mã thực tế sau đó chúng tôi có thể cho bạn biết lỗi cú pháp là (và tại sao nó sai) và bạn sẽ tìm hiểu nhiều hơn nếu chúng tôi chỉ cung cấp cho bạn cú pháp chính xác. – twain249

+0

'std :: chuỗi var = std :: string (" sometext ") + somevar +" sometext "+ somevar;' –

Trả lời

44

Bạn đã cân nhắc sử dụng chuỗi chuỗi chưa?

#include <string> 
#include <sstream> 

std::ostringstream oss; 
oss << "sometext" << somevar << "sometext" << somevar; 
std::string var = oss.str(); 
+0

Chính xác + std :: ostringstream sẽ là đủ. – doc

+0

Cảm ơn @eli - Đây là phương pháp mà ban đầu tôi đã cố gắng mà không có bất kỳ may mắn nào, nhưng hiện đang hoạt động! Bạn có thể giải thích những gì ss.str() đang làm gì? –

+0

'ss.str()' là trích xuất nội dung của 'chuỗi ký tự'. –

2

Bạn cũng có thể sử dụng sprintf:

char str[1024]; 
sprintf(str, "somtext %s sometext %s", somevar, somevar); 
+2

Điều này không an toàn lắm. Sự phức tạp hơn làm cho nó an toàn có lẽ làm cho nó không phải là một lựa chọn rất tốt. –

+0

'snprintf()' sẽ là một lựa chọn tốt hơn. 'snprintf (str, 1024," somtext% s sometext% s ", somevar, somevar);' – doc

+2

Đây không phải là an toàn, nhưng * quá * tiện dụng so với stky cồng kềnh :: string & ostringstream. – Yury

16
std::string var = "sometext" + somevar + "sometext" + somevar; 

này không làm việc vì những bổ sung được thực hiện từ trái sang phải và "sometext" (người đầu tiên) chỉ là một const char *. Nó không có số operator+ để gọi. Việc sửa chữa đơn giản nhất là thế này:

std::string var = std::string("sometext") + somevar + "sometext" + somevar; 

Bây giờ, các tham số đầu tiên trong danh sách từ trái sang phải của + hoạt động là một std::string, trong đó có một operator+(const char *). Toán tử đó tạo ra một chuỗi, làm cho phần còn lại của chuỗi hoạt động.

Bạn cũng có thể làm cho tất cả các hoạt động được trên var, mà là một std::string và do đó có tất cả các nhà khai thác cần thiết:

var = "sometext"; 
var += somevar; 
var += "sometext"; 
var += somevar; 
+1

... giả định rằng * type * của 'somevar' nằm trong danh sách' toán tử + (* type *) '. – doc

+0

@doc Yep. Nếu không, bạn sẽ phải thêm một số mã xung quanh 'somevar' để làm cho nó hoạt động.Ví dụ, nếu đó là một 'int', bạn có thể sử dụng Boost :: lexical_cast để làm cho nó thành một chuỗi. (Hoặc, trong trường hợp đó, giải pháp 'stringstream' có thể tốt hơn.) –

2

Xem thêm boost::format:

#include <boost/format.hpp> 

std::string var = (boost::format("somtext %s sometext %s") % somevar % somevar).str(); 
10

Trong C++ 11 bạn có thể sử dụng std::to_string:

std::string var = "sometext" + std::to_string(somevar) + "sometext" + std::to_string(somevar); 
Các vấn đề liên quan