Làm thế nào để nối hai chuỗi trong C ++?


100

Tôi có một biến lớp riêng tư char name[10]mà tôi muốn thêm .txtphần mở rộng để tôi có thể mở tệp có trong thư mục.

Làm thế nào để tôi đi về điều này?

Sẽ tốt hơn nếu tạo một biến chuỗi mới chứa chuỗi được nối.

Câu trả lời:


160

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.


3
Độ phức tạp về thời gian của việc nối chuỗi này là gì?
d34th4ck3r 17/12/16

@ d34th4ck3r: Nó là tuyến tính.
Nawaz

30

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";

1
Đáng chú ý, việc sử dụng tầm thường đi kèm với một thẻ giá không hề nhỏ liên quan đến hiệu suất thời gian chạy. Trường hợp tệ nhất là 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.
IInspectable

15

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?


1
Bạn không thể thấy rằng anh chàng đã đặt một câu hỏi bằng c ++ chứ không phải bằng C sao ??
IcyFlame

21
Bạn không thấy rằng tôi đã nói "Nếu bạn đang lập trình ..."?
TonyK

Bạn không nghĩ rằng câu trả lời này là không liên quan cho câu hỏi này?
IcyFlame

9
Tôi nghĩ điều này có liên quan vì "anh chàng" đang sử dụng char thay vì std :: string. Hơn nữa, nó cho thấy một cách nối rõ ràng mà không được hiển thị trong câu trả lời được bình chọn nhiều nhất. Ít nhất tôi đã học được điều gì đó với nó.
gvegayon

1
Điều này cũng cho thấy một phương pháp thực hiện nối chuỗi mà không cần cấp phát bộ nhớ động. Trừ khi tôi sai, std :: string operator + = yêu cầu khả năng phân bổ lại.
Ashley Duncan

7

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.


Xem bình luận của tôi cho câu trả lời của IcyFlame.
TonyK

3
Ngoài ra còn có strncat()chức năng mà thường là lựa chọn tốt hơn
nogard

@nogard: 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ì.
TonyK


0

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

0

C ++ 14

std::string great = "Hello"s + " World"; // concatenation easy!

Trả lời câu hỏi:

auto fname = ""s + name + ".txt";

-2
//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;
}
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.