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:
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.
C ++ olduğu için neden std::stringyerine kullanılmasın char*? Birleştirme önemsiz olacaktır:
std::string str = "abc";
str += "another";
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.
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?
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.
strncat()Genellikle daha iyi bir alternatif olan işlev de vardır
strncatburada alakasızdır çünkü ikinci parametrenin uzunluğunu zaten biliyoruz ".txt". Öyleyse strncat(name, ".txt", 4), bize hiçbir şey kazandırmayan olur.
strcat (hedef, kaynak), c ++ 'da iki dizeyi birleştirmek için kullanılabilir.
Derin bir anlayışa sahip olmak için aşağıdaki bağlantıya bakabilirsiniz.
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
//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;
}