C'de çalışıyorum ve birkaç şeyi birleştirmem gerekiyor.
Şu anda elimde bu var:
message = strcat("TEXT ", var);
message2 = strcat(strcat("TEXT ", foo), strcat(" TEXT ", bar));
Şimdi, eğer C'de deneyiminiz varsa, çalıştırmaya çalıştığınızda bunun size bir segmentasyon hatası verdiğini fark edeceğinizden eminim. Peki bunu nasıl aşabilirim?
C'de "stringler" sadece düz char
dizileridir. Bu nedenle, bunları diğer "string" ile doğrudan birleştiremezsiniz.
srctarafından işaret edilen dizeyi
desttarafından işaret edilen dizenin sonuna ekleyen
strcat` işlevini kullanabilirsiniz:
char *strcat(char *dest, const char *src);
İşte cplusplus.com'dan bir örnek:
char str[80];
strcpy(str, "these ");
strcat(str, "strings ");
strcat(str, "are ");
strcat(str, "concatenated.");
İlk parametre için hedef tamponun kendisini sağlamanız gerekir. Hedef tampon bir char dizi tamponu olmalıdır. Örneğin: char tampon[1024];
İlk parametrenin içine kopyalamaya çalıştığınız şeyi depolamak için yeterli alana sahip olduğundan emin olun. Eğer imkanınız varsa, aşağıdaki gibi fonksiyonları kullanmak daha güvenlidir: Hedef tamponun boyutunu açıkça belirtmeniz gereken strcpy_s
ve strcat_s
gibi fonksiyonları kullanmak daha güvenlidir.
Not: Bir dize değişmezi, bir sabit olduğu için tampon olarak kullanılamaz. Bu nedenle, tampon için her zaman bir char dizisi ayırmanız gerekir.
strcat`in geri dönüş değeri basitçe göz ardı edilebilir, sadece ilk argüman olarak aktarılan aynı işaretçiyi döndürür. Kolaylık sağlamak için vardır ve çağrıları tek bir kod satırında zincirlemenizi sağlar:
strcat(strcat(str, foo), bar);
Yani sorununuz şu şekilde çözülebilir:
char *foo = "foo";
char *bar = "bar";
char str[80];
strcpy(str, "TEXT ");
strcat(str, foo);
strcat(str, bar);
Dize değişmezlerini değiştirmeye çalışmak tanımlanmamış bir davranıştır:
strcat ("Hello, ", name);
yapmaya çalışacaktır. İyi tanımlanmamış olan "Hello, "
string literalinin sonuna name
stringini eklemeye çalışacaktır.
Şöyle bir şey dene. Yapmaya çalışıyor gibi göründüğünüz şeyi başarır:
char message[1000];
strcpy (message, "TEXT ");
strcat (message, var);
Bu, değiştirilmesine izin verilen bir tampon alan oluşturur ve ardından hem değişmez dizeyi hem de diğer metni buraya kopyalar. Tampon taşmalarına karşı dikkatli olun. Giriş verilerini kontrol ederseniz (veya önceden kontrol ederseniz), benim yaptığım gibi sabit uzunlukta tamponlar kullanmakta sorun yoktur.
Aksi takdirde, başa çıkabileceğinizden emin olmak için heap'ten yeterli bellek ayırmak gibi hafifletme stratejileri kullanmalısınız. Başka bir deyişle, şöyle bir şey:
const static char TEXT[] = "TEXT ";
// Make *sure* you have enough space.
char *message = malloc (sizeof(TEXT) + strlen(var) + 1);
if (message == NULL)
handleOutOfMemoryIntelligently();
strcpy (message, TEXT);
strcat (message, var);
// Need to free message at some point after you're done with it.
strcat() işlevinin ilk argümanı, birleştirilen dize için yeterli alan tutabilmelidir. Bu yüzden sonucu almak için yeterli alana sahip bir tampon ayırın.
char bigEnough[64] = "";
strcat(bigEnough, "TEXT");
strcat(bigEnough, foo);
/* and so on */
strcat() ikinci argümanı ilk argümanla birleştirir ve sonucu ilk argümanda saklar, döndürülen char* sadece bu ilk argümandır ve sadece size kolaylık sağlamak içindir.
Kodunuza dayanarak beklediğinizi tahmin ettiğim gibi, birinci ve ikinci bağımsız değişkenlerin birleştirilmesiyle yeni ayrılmış bir dize elde edemezsiniz.