Câu trả lời:
Trước hết, không sử dụng char*hoặc char[N]. Sử dụng std::string, sau đó mọi thứ khác trở nên thật dễ dàng!
Ví dụ,
std::string s = "Hello";
std::string greet = s + " World"; //concatenation easy!
Dễ dàng, phải không?
Bây giờ nếu bạn cần char const *vì lý do nào đó, chẳng hạn như khi bạn muốn chuyển đến một số hàm, thì bạn có thể thực hiện điều này:
some_c_api(s.c_str(), s.size());
giả sử hàm này được khai báo là:
some_c_api(char const *input, size_t length);
Khám phá std::stringbản thân bắt đầu từ đây:
Hy vọng rằng sẽ giúp.
Vì nó là C ++ tại sao không sử dụng std::stringthay thế char*? Kết nối sẽ là tầm thường:
std::string str = "abc";
str += "another";
operator+=thực hiện cả phân bổ giao dịch và phân bổ. Phân bổ đống là một trong những hoạt động tốn kém nhất mà chúng tôi thường làm.
Nếu bạn đang lập trình bằng C, thì giả sử namethực sự là một mảng có độ dài cố định như bạn nói, bạn phải làm như sau:
char filename[sizeof(name) + 4];
strcpy (filename, name) ;
strcat (filename, ".txt") ;
FILE* fp = fopen (filename,...
Bạn thấy bây giờ tại sao mọi người đề xuất std::string?
Có một hàm strcat () từ thư viện C đã chuyển sẽ thực hiện việc nối "C style string" cho bạn.
BTW mặc dù C ++ có một loạt các hàm để xử lý các chuỗi kiểu C, nhưng nó có thể có lợi cho bạn, hãy thử và tìm ra hàm của riêng bạn để thực hiện điều đó, chẳng hạn như:
char * con(const char * first, const char * second) {
int l1 = 0, l2 = 0;
const char * f = first, * l = second;
// step 1 - find lengths (you can also use strlen)
while (*f++) ++l1;
while (*l++) ++l2;
char *result = new char[l1 + l2];
// then concatenate
for (int i = 0; i < l1; i++) result[i] = first[i];
for (int i = l1; i < l1 + l2; i++) result[i] = second[i - l1];
// finally, "cap" result with terminating null char
result[l1+l2] = '\0';
return result;
}
...và sau đó...
char s1[] = "file_name";
char *c = con(s1, ".txt");
... kết quả là file_name.txt.
Bạn cũng có thể bị cám dỗ để viết operator +toán tử IIRC của riêng bạn, tuy nhiên, toán tử IIRC chỉ chứa các con trỏ vì đối số không được phép.
Ngoài ra, đừng quên kết quả trong trường hợp này được cấp phát động, vì vậy bạn có thể muốn gọi xóa trên nó để tránh rò rỉ bộ nhớ hoặc bạn có thể sửa đổi hàm để sử dụng mảng ký tự được phân bổ ngăn xếp, tất nhiên là nó có đủ độ dài.
strncat()chức năng mà thường là lựa chọn tốt hơn
strncatkhông liên quan ở đây, vì chúng ta đã biết độ dài của tham số thứ hai ".txt". Vì vậy, nó sẽ chỉ là strncat(name, ".txt", 4), mà không mang lại cho chúng tôi bất cứ điều gì.
strcat (đích, nguồn) có thể được sử dụng để nối hai chuỗi trong c ++.
Để hiểu sâu các bạn có thể tra cứu ở link sau-
Tốt hơn là sử dụng lớp chuỗi C ++ thay vì chuỗi C kiểu cũ, cuộc sống sẽ dễ dàng hơn nhiều.
nếu bạn có chuỗi kiểu cũ hiện có, bạn có thể ẩn vào lớp chuỗi
char greeting[6] = {'H', 'e', 'l', 'l', 'o', '\0'};
cout<<greeting + "and there \n"; //will not compile because concat does \n not work on old C style string
string trueString = string (greeting);
cout << trueString + "and there \n"; // compiles fine
cout << trueString + 'c'; // this will be fine too. if one of the operand if C++ string, this will work too
//String appending
#include <iostream>
using namespace std;
void stringconcat(char *str1, char *str2){
while (*str1 != '\0'){
str1++;
}
while(*str2 != '\0'){
*str1 = *str2;
str1++;
str2++;
}
}
int main() {
char str1[100];
cin.getline(str1, 100);
char str2[100];
cin.getline(str2, 100);
stringconcat(str1, str2);
cout<<str1;
getchar();
return 0;
}