Bagaimana cara menggabungkan dua string di C ++?

100

Saya memiliki variabel kelas privat char name[10]yang ingin saya tambahkan .txtekstensi sehingga saya dapat membuka file yang ada di direktori.

Bagaimana saya melakukan ini?

Akan lebih disukai untuk membuat variabel string baru yang menampung string yang digabungkan.

Slashr
sumber

Jawaban:

160

Pertama-tama, jangan gunakan char*atau char[N]. Gunakan std::string, maka semuanya menjadi sangat mudah!

Contoh,

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

Mudah bukan?

Sekarang jika Anda membutuhkan char const *karena alasan tertentu, seperti ketika Anda ingin meneruskan ke beberapa fungsi, maka Anda dapat melakukan ini:

some_c_api(s.c_str(), s.size()); 

dengan asumsi fungsi ini dideklarasikan sebagai:

some_c_api(char const *input, size_t length);

Jelajahi std::stringdiri Anda mulai dari sini:

Semoga membantu.

Nawaz
sumber
3
Berapa kompleksitas waktu penggabungan string ini?
d34th4ck3r
@ d34th4ck3r: Ini linier.
Nawaz
30

Sejak itu C ++ mengapa tidak menggunakan std::stringbukan char*? Penggabungan akan menjadi sepele:

std::string str = "abc";
str += "another";
nogard
sumber
1
Perlu dicatat, penggunaan yang sepele hadir dengan label harga non-sepele sehubungan dengan kinerja runtime. Kasus terburuk adalah, yang operator+=melakukan deallocation dan alokasi. Alokasi heap adalah salah satu operasi paling mahal yang biasa kami lakukan.
IInspectable
15

Jika Anda memprogram dalam C, maka asumsikan namebenar-benar adalah array dengan panjang tetap seperti yang Anda katakan, Anda harus melakukan sesuatu seperti berikut:

char filename[sizeof(name) + 4];
strcpy (filename, name) ;
strcat (filename, ".txt") ;
FILE* fp = fopen (filename,...

Anda lihat sekarang mengapa semua orang merekomendasikan std::string?

TonyK
sumber
1
Tidak bisakah kamu melihat bahwa pria itu telah mengajukan pertanyaan di c ++ dan bukan di C ??
IcyFlame
21
Tidak bisakah kamu melihat bahwa aku berkata "Jika kamu memprogram ..."?
TonyK
Tidakkah menurut Anda jawaban ini tidak relevan untuk pertanyaan ini?
IcyFlame
9
Saya pikir ini relevan karena "the guy" menggunakan char daripada std :: string. Selain itu, ini menunjukkan cara penggabungan eksplisit yang tidak ditampilkan dalam jawaban yang paling banyak dipilih. Setidaknya saya belajar sesuatu dengan itu.
gvegayon
1
Ini juga menunjukkan metode melakukan penggabungan string tanpa alokasi memori dinamis. Kecuali saya salah, std :: string operator + = membutuhkan kemungkinan realokasi.
Ashley Duncan
7

Ada fungsi strcat () dari pustaka C porting yang akan melakukan penggabungan "C style string" untuk Anda.

BTW meskipun C ++ memiliki banyak fungsi untuk menangani string gaya-C, ini bisa bermanfaat bagi Anda untuk mencoba dan membuat fungsi Anda sendiri yang melakukan itu, seperti:

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

...lalu...

char s1[] = "file_name";
char *c = con(s1, ".txt");

... hasilnya adalah file_name.txt.

Anda mungkin juga tergoda untuk menulis sendiri operator +namun operator IIRC membebani dengan hanya pointer karena argumen tidak diperbolehkan.

Selain itu, jangan lupa hasil dalam kasus ini dialokasikan secara dinamis, jadi Anda mungkin ingin memanggil delete untuk menghindari kebocoran memori, atau Anda dapat memodifikasi fungsi untuk menggunakan array karakter yang dialokasikan tumpukan, asalkan tentu saja itu memiliki panjang yang cukup.

dtech
sumber
Lihat komentar saya untuk jawaban IcyFlame.
TonyK
3
Ada juga strncat()fungsi alternatif yang biasanya lebih baik
nogard
@nogard: strncattidak relevan di sini, karena kita sudah mengetahui panjang parameter kedua ".txt". Jadi itu hanya akan terjadi strncat(name, ".txt", 4), yang tidak memberi kita apa-apa.
TonyK
0

Lebih baik menggunakan kelas string C ++ daripada string C gaya lama, hidup akan jauh lebih mudah.

jika Anda sudah memiliki gaya string lama, Anda dapat mengonversinya ke kelas string

    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
i.AsifNoor
sumber
0

C ++ 14

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

Jawab pertanyaan:

auto fname = ""s + name + ".txt";
SM
sumber
-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;
}
Kartik
sumber