08.11.2014 Views

c_kitap

c_kitap

c_kitap

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

C ve Sistem Programcıları Derneği - C Ders Notları - Necati Ergin<br />

char *pd;<br />

int k;<br />

char buffer[BUFFER_SIZE] = {'\0'};<br />

va_start (ap, ptr);<br />

while (ptr){<br />

strcat(buffer, ptr);<br />

ptr = va_arg(ap, const char *);<br />

}<br />

}<br />

pd = (char *)malloc(strlen(buffer) + 1);<br />

if (pd == NULL) {<br />

printf("bellek yetersiz!\n");<br />

exit(EXIT_FAILURE);<br />

}<br />

va_end(ap);<br />

return strcpy(pd, buffer);<br />

int main ()<br />

{<br />

char *pstr = con_strings("C ", "ve ", "Sistem ", "Programcilari ",<br />

"Dernegi", NULL);<br />

puts(pstr);<br />

free(pstr);<br />

}<br />

return 0;<br />

con_strings işlevinin tanımını inceleyin:<br />

va_list türünden ap değişkeni va_start makrosuyla ilkdeğerini alıyor.<br />

va_start (ap, ptr);<br />

Parametre değişkeni olan ptr nin değeri NULL adresi olmadığı sürece dönen bir while<br />

döngüsü oluşturulduğunu görüyorsunuz. Döngünün her turunda işleve gönderilen<br />

argümanlardan her birinin değeri va_arg makrosuyla elde ediliyor ve bu değer ptr<br />

göstericisine atanıyor. ptr göstericisinin gösterdiği yazı önce yerel buffer isimli dizideki<br />

yazının sonuna standart strcat işleviyle ekleniyor. İşleve çağrı ile gönderilen son<br />

argümanın NULL adresi olması gerekiyor. ptr göstericisinin değeri NULL adresi olduğunda<br />

buffer dizisindeki yazı dinamik bir bellek bloğuna kopyalanıyor. İşlev içinde va_end<br />

makrosu çağırıldıktan sonra işlev dinamik bloğun adresiyle geri dönüyor.<br />

528

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!