C ++ 'da iki dize nasıl birleştirilir?


100

Dizinde bulunan dosyayı açabilmek için uzantıyı char name[10]eklemek istediğim özel bir sınıf değişkenim var .txt.

Bunu nasıl yapacağım?

Birleştirilmiş dizeyi tutan yeni bir dize değişkeni oluşturmak tercih edilir.

Yanıtlar:


160

Her şeyden önce char*veya kullanmayın char[N]. Kullanın std::string, sonra her şey çok kolay hale gelir!

Örnekler,

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

Kolay değil mi?

Şimdi char const *, bir işleve geçmek istediğinizde olduğu gibi bir nedenden ötürü ihtiyacınız varsa, bunu yapabilirsiniz:

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

bu işlevin şu şekilde bildirildiğini varsayarsak:

some_c_api(char const *input, size_t length);

std::stringBuradan başlayarak kendinizi keşfedin :

Umarım yardımcı olur.


3
Bu dize birleştirme işleminin zaman karmaşıklığı nedir?
d34th4ck3r

@ d34th4ck3r: Doğrusaldır.
Nawaz

30

C ++ olduğu için neden std::stringyerine kullanılmasın char*? Birleştirme önemsiz olacaktır:

std::string str = "abc";
str += "another";

1
Önemsiz kullanım, çalışma zamanı performansı açısından önemsiz olmayan bir fiyat etiketi ile birlikte gelir. En kötü durum, operator+=hem ayırma hem de ayırma gerçekleştirmesidir. Yığın tahsisleri, yaygın olarak yaptığımız en pahalı işlemler arasındadır.
IInspectable

15

C ile programlama yapıyorsanız, o zaman namegerçekten söylediğiniz gibi sabit uzunlukta bir dizi olduğunu varsayarsak , aşağıdaki gibi bir şey yapmanız gerekir:

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

Şimdi neden herkesin önerdiğini anlıyor std::stringmusunuz?


1
Adamın c ++ dilinde değil de C dilinde bir soru sorduğunu göremiyor musunuz?
IcyFlame

21
"Programlıyorsan ..." dediğimi görmüyor musun?
TonyK

Bu cevabın bu soru için alakasız olduğunu düşünmüyor musun?
IcyFlame

9
Bunun konuyla alakalı olduğunu düşünüyorum çünkü "adam" std :: string yerine char kullanıyor. Dahası, en çok oylanan cevapta gösterilmeyen açık bir birleştirme yolunu gösterir. En azından onunla bir şeyler öğrendim.
gvegayon

1
Bu aynı zamanda dinamik bellek ayırma olmadan dize birleştirme yapmanın bir yöntemini gösterir. Yanılmıyorsam, std :: string operatörü + = olası bir yeniden tahsis gerektiriyor.
Ashley Duncan

7

Bir strcat () var C kütüphanesinden sizin için "C stili dizge" birleştirmesini yapacak işlevi vardır.

BTW, C ++ 'ın C tarzı dizelerle başa çıkmak için bir dizi işlevi olmasına rağmen, bunu yapan kendi işlevinizi denemek ve ortaya çıkarmak sizin için yararlı olabilir, örneğin:

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

...ve sonra...

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

... sonucu file_name.txt.

Ayrıca operator +, bağımsız değişkenlere izin verilmediğinden, IIRC operatörü yalnızca işaretçilerle aşırı yükleme yapar.

Ayrıca, bu durumda sonucun dinamik olarak tahsis edildiğini unutmayın, bu nedenle bellek sızıntılarını önlemek için silme işlevini çağırmak isteyebilirsiniz veya yeterli uzunluğa sahip olması koşuluyla, yığına ayrılmış karakter dizisini kullanmak için işlevi değiştirebilirsiniz.


IcyFlame'in cevabına yaptığım yorumu görün.
TonyK

3
strncat()Genellikle daha iyi bir alternatif olan işlev de vardır
nogard

@nogard: strncatburada alakasızdır çünkü ikinci parametrenin uzunluğunu zaten biliyoruz ".txt". Öyleyse strncat(name, ".txt", 4), bize hiçbir şey kazandırmayan olur.
TonyK


0

Eski tarz C dizesi yerine C ++ dizge sınıfını kullanmak daha iyidir, hayat çok daha kolay olurdu.

eski stil dizgeniz varsa, dizge sınıfına dönüştürebilirsiniz

    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!

Sorunun cevabı:

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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.