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 />

gets işlevi, dizi için hiçbir şekilde dizinin taşmasına yönelik bir kontrol yapmaz. gets işlevi<br />

ile dizi eleman sayısından daha fazla karakter girilirse, dizi taşacağı için beklenmeyen<br />

sonuçlarla karşılaşılabilir. Bu tür durumları göstericiler konusunda "gösterici hataları"<br />

başlığı altında ayrıntılı olarak inceleyeceğiz.<br />

gets işlevi '\0' karakterini dizinin sonuna eklediği için, SIZE boyutunda bir dizi için gets<br />

işleviyle alınacak karakter sayısı en fazla SIZE – 1 olmalıdır. Çünkü sonlandırıcı karakter<br />

de diğer karakterler gibi bellekte bir yer kaplar. Örnek :<br />

char isim[6];<br />

gets(isim);<br />

ile klavyeden Necati isminin girildiğini düşünelim:<br />

isim dizisinin tanımlanmasıyla derleyici bu dizi için bellekte 6 byte yer ayırır (isim[0]<br />

...isim[5]).<br />

gets işlevi bu durumda '\0' karakterini, derleyicinin dizi için ayırmadığı bir bellek<br />

hücresine yazar. Bu tür durumlara "dizinin bir taşırılması hatası" (off bye one) denir.<br />

Taşma durumuyla ilgili olarak ortaya çıkacak hatalar, derleme zamanına değil çalışma<br />

zamanına (run time) ilişkindir.<br />

Aşağıdaki programı inceleyin:<br />

#include <br />

#define SIZE 100<br />

int main()<br />

{<br />

char str[SIZE];<br />

int ch;<br />

int index = 0;<br />

printf("bir yazı girin: ");<br />

printf("\n\n");<br />

while ((ch = getchar()) != '\n')<br />

str[index++] = ch;<br />

str[index] = '\0';<br />

}<br />

return 0;<br />

Yukarıdaki main işlevinde klavyeden alınan bir yazı str dizisi içinde saklanıyor. Klavyeden<br />

'\n' karakteri alınana kadar, girilen tüm karakterler str dizisinin elemanlarına sırayla<br />

atanıyor. Klavyeden '\n' karakteri alındığında, diziye yazılan son karakterden sonra,<br />

dizideki yazının sonunu işaretlemesi amacıyla '\0' karakter yazılıyor.<br />

Klavyeden alınan bir yazı, char türden bir dizinin içine standart scanf işleviyle de<br />

yerleştirilebilir. Bu amaçla %s format karakterleri kullanılır. Ancak bu durumda klavyeden<br />

218

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

Saved successfully!

Ooh no, something went wrong!