C'de gets fonksiyonunun implementasyonu

10:44

Standart gets fonksiyonu EOF veya new line("\n") karakteri görene kadar stdin dosyasından okuma yapar ve bu okunan iki karakterden gelen herhangi birinin yerine "\0" karakteri  ile yer değiştirir. gets fonksiyonu parametre olarak aldığı char * adresinden başlayarak içini doldurur ve başlangıç adresini geri dönüş değeri olarak verir. gets fonksiyonunu getchar kullanılarak yazmak mümkündür.Biz bu implementasyonu yaparak gets fonksiyonunu daha iyi anlamış oluruz. ( getchar fonksiyonu stdin'inden tek bir karakter okuma işlemi yapar. )


Yukarıdaki mygetsv1 versiyonunda while döngüsü ile tek tek karakter okuması yapar ve gelen karakter new line veya EOF karakteri ise döngüden çıkmaktadır.  "\n" ve EOF karakterlerine okuma yapar yani stdin' den alır ama bunları diziye koymaz onun yerine "\0" yani null karakter yerleştirmektedir.

Eğer diziye hiç atama yapılmamış ve gelen karakter EOF ise NULL geri dönüş yapmaktadır aksi halde üzerinde işlem yapılan dizinin başlangıç adresini geri döndürür.



mygetsv2'de ise aynı algoritma for döngüsüyle implemente edilmiştir.



main fonksiyonu ise mygets fonksiyonlarının geri dönüş değeri NULL olana kadar okuma yapar ve ekrana bastırır. Fonksiyonun çalıştırırsak aşağıdaki gibi düzgün çalıştığı görülebilir.



C'de opendir-readdir-closedir Fonksiyonları



  • opendir: Dosya açma
  • readdir: Dosya okuma
  • closedir: Dosya kapama


Öncelikler Linux sistemlerde (Sistem programlamada) dosya kavramı normal dosyalar ve dizinleri de içerecek şekilde kullanılmaktadır. Basit bir klasör listeleme programı aşağıdaki gibi yazılacaktır:



opendir ile dosya açılır ardından readdir ile içinde bulunan dosyalar okunur.


readdir fonksiyonunun geri dönüş değeri struct dirent pointer türündendir. 


Dosyaları listelemede filtreleme yapmak istersek aşağıdaki örnekten faydalanılabilir.


Dosyaların isimlerine ve diğer bilgilerine ent->d_name ile ulaşılır. struct dirent içinde başka bir çok bilgi bulunmaktadır. istediğimiz bilgileri ekrana yazdırabiliriz.

Bizim programın çıktısı aşağıdaki gibi olmuştur:



Sistemdeki Sürücüleri Listeleme

05:45

Windows işletim sisteminde C programlama dili kullanılarak nasıl sisteme takılı olan sürücüleri elde edebiliriz? Bu sorunun çözümü windowsta bulunan GetLogicalDriveStrings fonksiyonunu kullanmaktır. Bu fonksiyonun nasıl kullanılacağı aşağıdaki gibidir:



Windows'ta Winpcap (Packet Capture Library) Kullanımı

11:19 , ,

Winpcap kütüphanesi windows ve Linux/Unix platformlar için yazılmış bir "packet capture library" sidir. Ünlü wireshark programı bu kütüphanenin üzerine bina edilmiştir. Bu kütüphaneyi windows'ta kullanarak uygulamalar geliştirmek için önce yapılması gerekenler sırasıyla aşağıdaki gibidir:


  • ilk önce http://www.winpcap.org/devel.htm adresinden developer paketinin indirilmesi gerekmektedir. 


  • Ardından Visual Studio'da include library klasörünü ve linker için lib klasörlerinin yerinin gösterilmesi ve preprocessor'e bununla ayar girilmesi gerekmektedir.


Additional Include Directories:  (Başlık Dosyalarının eklenmesi)


Additional Library Directories: (Kütüphanelerin eklenmesi)



Additional Dependencies: (Ön işlemci kütüphanesinin eklenmesi)


Preprocessor Definitions


C'de extern anahtar sözcüğü

11:21

Bir kaynak dosya içinde tanımlanan bir değişkene ya da işleve, yalnızca tanımlandığı kaynak dosya içinde değil, projeyi oluşturan diğer kaynak dosyalarda da erişilebiliyorsa, nesne ya da işlevin dış bağlantısı “external linkage” vardır denir.

Bir kaynak dosya içinde tanımlanan bir değişkene ya da işleve, yalnızca tanımlandığı kaynak dosya içinde erişilebiliyorsa, projeyi oluşturan diğer kaynak dosyalarda erişilemiyorsa, nesne ya da işlevin iç bağlantısı “internal linkage” vardır denir.

extern anahtar kelimesi derleyiciye değişkenin dışarıda tanımlandığını bildirmek için kullanılan bir keyword'tür. Compiler extern keyword'unu gördüğünde değişken için alan tahsisinde bulunmaz. 





Yukarıdaki a.c | b.c | c.c şeklinde üç c dosyası bulunmaktadır. b.c dosyası içinde g_x değişkeni bildirilmiş a.c ile c.c dosyalarında extern keyword'u ile dış bağlantıya ait g_x değişkeni kullanılmıştır.



eğer b.c dosyasında da int g_x bildirimi olmasaydı veya orada da extern g_x bildirilimi yapılsaydı compile aşamasında olmasada link aşamasında hata verecekti.



scanf fonksiyonunun türevleri [ scanf, sscanf, fscanf ]

10:58


scanf, sscanf, fscanf fonksiyonları okuma amaçlı kullanılan fonksiyonlardır. Kısaca her birine değinmek gerekirse:

scanf:

scanf stdin dosyasından formatlı okuma yapmak için kullanılan bir fonksiyondur.  

int scanf(const char *format, ...);




sscanf:

sscanf ise bir veri yapısından formatlı okuma yapmak için kullanılan bir fonksiyondur.

int sscanf(const char *str, const char *format, ...);



fscanf:

fscanf ise dosyadan formatlı okuma yapmak için kullanılan bir fonksiyondur.

int fscanf(FILE *stream, const char *format, ...);


ÖZET: scanf format bilgisini ve bu formata göre aldığı değerleri yazacağı adresi ister. fscanf ise dosyadan formatlı okuma yapmak için kullanılır. scanf'e ek olarak dosya handle değerini ister. sscanf ise dosya yerine string gibi bir veri yapısından formatlı okuma yapar.


C'de Operatörler

11:15

ATAMA OPERATÖRLERİ

C' de bir den fazla atama operatörü vardır. Diğer dillerde atama operatörünün değer üretmesi gibi bir durum yoktur. C’de bu operatörde değer üretir.
image
C dilinde atama operatörü bir değer üretir.
  • Atama operatörünün ürettiği değer nesneye atanan değerdir.
  • Atama operatörünün öncelik yönü sağdan sola doğrudur.
x=y=z=t=func();
image

  • Well Formed : Çalışma Anında ne olacağı belli olan bunun garantisi verilen programlardır. Bazı kodlar çalışma anında ne olacağı kesin değildir. Kod legal ama çalışma anında ne olacağı, nasıl cevap vereceği belli değildir. Run time ‘da her şey olabilir. (ill formed)
  • Undefined Behaviour : Syntax hatası olmamasına karşın run time’de nasıl çalışacağına ilişkin bir garanti olmamasıdır.
image

image

  • Sequence point : yaptığınız işlemin etkisini gösterdiği noktaya denir.

image

image

Noktalı virgülden sonra ve yukarıda ki 4 operatörden sonra ve ( ) ‘den sonra yan etki noktası vardır.
Bir yan etki noktasından önce yan etkiye maruz kalan bir değişkeni tekrardan kullanmayın.
  • Tanımsız davranış demek hatalı kod demektir.
C’de bazı durumlarda nasıl davranacağı belirtilmemiştir. Bu durumlara ise Undefined Behavior denir. Yani ne sonuc vereceği belirsizdir.

image

Mesela 15%-2 işleminin sonucu +1 de olabilir -1 ‘de Derleyiciden derleyiciye değişen davranışlardır. Standartlar bu durumun uclarını açık bırakmışlardır. Bu sebeple genel olarak derleyiciler öğretmen olarak kullanmak yanlış bir yargıya ulaşmamıza sebep olabilir.

VİRGÜL OPERATÖRÜ

Diğer programlama dillerinde virgül operatörü yoktur. C’de virgül hem operatör hem de syntax’ın bir parçasıdır.
image

  • for (i=3,k=5;k<x;k++) :ifade virgül operatörü sayesinde yapılmıştır. Virgül operatörünün de geri dönüş değeri vardır. Virgül operatörünün sağındaki operand
x=10, y=20;                 
z=(y,x); z 10’a eşit olur.

  • C’de yapılan en büyük hatalardan biri "." konulması gereken yere "," konulmasıdır.


image

LOGIC OPERATÖRLER


  • !          :logical DEĞİL
  • ||          :logical OR 
  • &&     :logical AND
  • |           :bitwise OR
  • &        :bitwise AND

Bazı aynı anlamlı ifadeler:


  • x<y      :    y>x
  • x>y      :    y<x
  • x>=y    :    !(x<y)
  • x<=y    :    !(y<x)
  • x==y    :    [!(x>y)&&!(x<y)]
  • x!=y     :    ((x<y)||(y<x))


C’de kısa devre kuralı
 :


  if(x>0 && y<-5) if’in içinde bulunan koşullardan biri yanlışsa ve operatöründe sola bakmak anlamsızdır bu nedenle C’de bu duruma kısa devre kuralı denir. Kısa devre kuralında bir Ve için bir yanlış yeterli iken veya için bir doğru yeterlidir.