2011-04-10 11 views
6

İki dizim var, str1 ve str2. Onları yığındaki boşlukta birleştirmek istiyorum. Ben kullanarak onlar için yer malloc:Bir dize için malloc boşluğa giden yolu düzeltin ve daha sonra karakterleri o alana mı ekleyin?

char *concat = (char*) malloc(strlen(str1) + strlen(str2) + 1); 

Sadece yapabilir:

strcat(concat, str1); 
strcat(concat, str2); 

Ve concat bana iki dizeleri ile öbek üzerinde yer concatted verecek? Ben soruyorum çünkü strcat aslında str1'i malloc kullanarak ayrılmış alanın sonuna ekleyecektir. Bu doğru mu? Öyleyse, str1, strlen (str1) + strlen (str2) + 1 olarak görünecektir.

Sormamın nedeni, yukarıdaki yöntemi kullanıyorum, ancak hata durumunda bir hata alıyorum:

strcpy(concat, str1); 
strcat(concat, str2); 

strcat orada boş sonlandırıcı olmanın dayanır ('\ 0') nerede olduğunu bilmek: Koşullu atlama veya taşıma bir strcpy ve daha sonra bir strcat yapmak istiyorum başlatılmamış değer (ler)

cevap

11

boş bayt orada src dize yazmak sonra dest başlayıp ileriye ve için aramasıdır.

malloc'dan sonra, bellek içeriği tanımsızdır, bu nedenle geçerli kodunuz çoğunda hatalı olan herhangi bir sayıyı yapabilir. strcat 'den önce concat[0] = 0 yaparsanız, kodunuz çalışır, ancak str1 uzunluğunu üç kez aramalıdır - bir kez strlen için, ilk strcat için ve ikinci strcat için son.

, ben bu size hem dizeleri bayt gitmek istediğiniz baştan biliyoruz gerçeği yararlanır memcpy:

size_t len1 = strlen(str1), len2 = strlen(str2); 
char *concat = (char*) malloc(len1 + len2 + 1); 

memcpy(concat, str1, len1); 
memcpy(concat+len1, str2, len2+1); 

ve kaç vardır kullanılmasını tavsiye yerine bile. Hata kontrolünden bahsetmek için

+0

+1 Bunu yapmak için kesinlikle çok iyi bir yol. Muhtemelen 'memcpy()' yerine memmove() 'yi kullanırım, çünkü memcpy() bu durumda güvenli olsa da, her zaman güvenli değildir, ancak memmove() her zaman güvenlidir. –

+4

'memmove' kullanmayın burada; kafa karıştırıcı. Herhangi bir 'memmove' kullanımı, çok farklı ve sıra dışı bir şey yaptığınızı belgelemeye hizmet etmelidir. 'Memmove' görürsem bir dakika ya da iki harcadım, neden # * $ @ birisinin onu kullandığını anlamaya çalışıyorum ve eğer balık bir şey oluyorsa ... –

4

bağlıdır başlamak. Sadece malloc ve strcat yaparsan, bazı kötü şeyler yapacak.

Ve hayır, ne strcpy ne de strcat herhangi bir örtülü ayırma veya yeniden tahsis işlemi gerçekleştirmeyecektir.

4

şahsen aşağıdakileri: strcat(dest, src) aslında ne yapar

size_t length = strlen(str1) + strlen(str2) + 1; 
char *concat = malloc(sizeof(char) * length); 

if(concat == NULL) 
{ 
    // error 
} 

snprintf(concat, length, "%s%s", str1, str2); 
+0

+1. snprintf() 'çoğu zaman iyi bir çözümdür; –

+2

Uzunluğunu hesaplamak için 'strlen' kullanmayın. 'Length = snprintf (0,0,"% s% s ", str1, str2) işlevlerini kullanın;' Veya sadece 'asprintf' kullanın (ve kendi sürümünüzü eklediğinizden emin olun - bu snprintf' etrafında önemsiz bir sarıcıdır - sistemler için) Bu GNU uzantısını içermeyen). –

+2

R'nin yukarıdaki yorumunun kendisi tarafından gerekçesi (tavsiyeyi anlamak için okumalıdır): http://stackoverflow.com/a/5615561/340236 – San

İlgili konular