Nối các chuỗi không hoạt động như mong đợi [đã đóng]


84

Tôi biết đó là một vấn đề phổ biến, nhưng tìm tài liệu tham khảo và tài liệu khác, tôi không tìm thấy câu trả lời rõ ràng cho câu hỏi này.

Hãy xem xét đoạn mã sau:

#include <string>

// ...
// in a method
std::string a = "Hello ";
std::string b = "World";
std::string c = a + b;

Trình biên dịch cho tôi biết nó không thể tìm thấy toán tử quá tải cho char[dim].

Có nghĩa là trong chuỗi không có toán tử +?

Nhưng trong một số ví dụ có một tình huống như thế này. Nếu đây không phải là cách chính xác để nối nhiều chuỗi hơn, thì cách tốt nhất là gì?


15
Mã của bạn sẽ biên dịch tốt, có nghĩa là bạn không hiển thị mã chính xác gây ra lỗi (trên hết là không đăng thông báo lỗi chính xác).
sbi

Vâng, nó không hoạt động ... Có lẽ lỗi của tôi là tôi đã không cung cấp trình biên dịch ... đó là g ++ không phải vc ... :)
Andry

Câu trả lời:


153

Mã của bạn, như đã viết, hoạt động. Có thể bạn đang cố gắng đạt được điều gì đó không liên quan, nhưng tương tự:

std::string c = "hello" + "world";

Điều này không hoạt động vì đối với C ++, điều này có vẻ như bạn đang cố gắng thêm hai charcon trỏ. Thay vào đó, bạn cần chuyển đổi ít nhất một trong các char*ký tự thành a std::string. Bạn có thể làm những gì bạn đã đăng trong câu hỏi (như tôi đã nói, mã này sẽ hoạt động) hoặc bạn làm như sau:

std::string c = std::string("hello") + "world";

3
char * là một con trỏ và không thể được thêm vào đơn giản vì nó yêu cầu cấp phát bộ nhớ. std :: string ẩn phân bổ, đây là lý do tại sao có thể cung cấp toán tử + cho chúng.
Vincent Robert

12
@Andry: Lý do điều này không hoạt động là C ++ kế thừa các chuỗi ký tự của nó từ C, đó là lý do tại sao chúng thuộc loại const char[]chứ không phải std::string. Trong C (và do đó cả trong C ++), mảng phân rã thành con trỏ rất dễ dàng, đó là lý do tại sao "a" + "b" sẽ gọi toán tử tích hợp thêm hai con trỏ. Kết quả của việc đó (một con trỏ trỏ vào đâu đó trong bộ nhớ) tất nhiên là khá vô dụng, nhưng tuy nhiên đây là điều chúng ta đang mắc kẹt.
sbi

2
@Andry: hợp lý nhưng sai. Phân bổ không liên quan gì đến việc này. Lời giải thích do @sbi đưa ra là đúng (ngoài thực tế là kết quả của một phép cộng con trỏ không phải là một con trỏ khác - đơn giản là không thể thêm hai con trỏ, vì kết quả sẽ vô nghĩa).
Konrad Rudolph

1
Ngoài ra, các ký tự chuỗi liền kề trực tiếp được trình biên dịch tự động nối. std::string c = "Hello" "world";, ví dụ, sẽ dẫn đến c == "Helloworld".
Fang

1
Bạn cũng có thể sử dụng các ký tự chuỗi: std;:string c = "hello"s + "world"s;hoặc chỉ tạo một trong số chúng a std::string.
Rakete1111


5

Tôi sẽ làm điều này:

std::string a("Hello ");
std::string b("World");
std::string c = a + b;

Mà biên dịch trong VS2008.


1
Cũng nên làm việc trong gcc.
graham.reeds

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.