Libft

LİBFT NOTLARIM

Derleme
Bir C kaynak kodunun başarıyla derlenmesi sonucu object code (amaç kod) olarak adlandırılan kodlar ve bu kodları tutan “.o” uzantılı dosya meydana gelir. Bu kodlar işletim sistemine ve derlediğimiz mimariye özel makine kodlarını içerir. Derlediğimiz her “.c” uzantılı kaynak kod dosyası, derleme sonucunda yine aynı isimde ve “.o” uzantısına sahip olan object code dosyalarını meydana getirecektir. 
 

Nedir Bu Header (.h)?
Header (başlık) dosyaları program kod satırları yazmaya başlandığı zaman program sizin her yazacağınız terimin türünü,ismin, yapısını vb. gibi tüm tanımlamaları sizden isteyecektir.  Hatırlayacağınız üzere C programlamada  programın kütüphane tanımladığımız kısmında #include <stdio.h> kütüphanesini eklemediğimiz zaman programda girdi ve çıkıtı (printf ve scanf) komutlarını kullanamıyorduk, işte bu kütüphaneyi tanımladığımız zaman bize bu fonksiyonları kullanma hakkı veriyordu. Kısacası header dosyaları birer alt fonksiyonlardan oluşan kütüphanelerdir.
  
isalpha
Büyük veya küçük alfabetik karakter kontrolü yapar.
isdigit
Rakam mı değil mi kontrol eder.
isalnum
Alfabetik karakter mi ya da rakam mı kontrol eder.
isascii
ASCII karakter kümesine uyup uymadığını kontrol eder.
isprint
Karakterin ekrana yazdırılabilir mi olduğunu sorgular

Her biri birer parametre olarak birer karakter alır. Ancak karakter parametresini isterken "integer" olarak ister.
örnek olarak: int isalpha(int c); Böyle olamasının sebebi parametreyi gönderirken klavyedeki karakterle sınırlı kalmak yerine ascii tablosundaki 500. karaktere de erişebilmektir. Zaten C dili tüm karakterleri integer olarak anlar.
Returnleri 1 veya 0'dır. 
Örneğin; eğer isalpha fonksiyonuna 'a' gönderirsek return'umuz 1 olacaktır.



strlen
Dizinin uzunluğunu hesaplar.
strlen fonksiyonu parametre olarak const char * alır. Yani sabit bir string alır. Ve aldığı bu stringin toplam kaç karakterli olduğunu sayıp return eder. Yani return'u sayısal bir değer olan "size_t'dir".

NOT: 
size_t, unsigned long'un typedef edilmiş halidir. 
Negatif değer alamaz. 
Kullanım amacı nesnelerin, dizilerin, stringlerin boyutunu ölçmektir. 
Başka bir programcı fonksiyonu okuduğunda ve size_t ifadesini gördüğünde o değişkenin öylesine bir değişken değil de bir nesnenin boyutunu ölçtüğünü anlayabilmelidir. 
Genel olarak size_t bu yüzden kullanılır.

memset
memset işlevi, c değerinde (işaretsiz bir karaktere dönüştürülmüş) len baytlarını b dizesine yazar. (b dizisini len kadar c ye çevirir)
memset'in returnu void *'dır. 
Void görünce bir şey return etmiyor anlamına gelmez, return'u void bir pointer'dır. 
Daha detaylı değineceğim. void *memset(void *s, int c, size_t n); şeklinde tanımlanır. 
Bir string, bir karakter ve bir de sayısal değer alır. fonksiyon aldığı c karakterini n kadar string'in üzerine yazar. 
Void pointer tipi olmayan bir pointer'dır. 
C'de int *'de char *'de 8 byte'dır. 
Her pointer gibi void *'da sadece adres bilgisi tutar bu yüzden 8 byte'dır. 
Void bir pointer'ı daha sonrasında bir char *'a veya int *'a atayabiliriz. Bize bu esnekliği sağlar. Bunun en bariz kullanımı "malloc" fonksiyonun return'udur. Void * return eder ve biz bunu dilersek int *'a, dilersek başka bir pointer'a typecast edebiliriz. 
NOT: 
mem ile başlayan fonksiyonların str ile başlayan fonksiyonlardan farkı şudur, bir stringin diğer veri tiplerinden farkı son karakterinin null olmasıdır. 
örneğin strcat fonksiyonunda belirtilen karakter kadar ilerleriz ancak eğer nulla ulaşırsak orada işlemi durdururuz. 
mem ile başlayan fonksiyonlarda null kontrolü yoktur. 
örneğin memsette "n" sayısına 100 verseydik stringin boyutunu aşsa bile 100 "byte" ilerlemesini isteyecektik. Yani mem fonksiyonlarda byte'a ve "memory"e göre kontrol yaparken, str fonksiyonlarda karakterlere göre kontrol yapılır.

bzero
bzero işlevi, s dizesine sıfırlanmış n bayt yazar. 
* n sıfır ise, bzero hiçbir şey yapmaz.
void bzero(void *s, size_t n); şeklinde tanımlanır. Bir strin ve bir sayı alır. Aldığı sayı kadar veya null'a ulaşana kadar stringin tüm karakterlerini null yapar. 
örneğin, bzero("burak", 3); -> çıktısı \0\0\0ak olacaktır.

memcpy ve memmove
memcpy ve memmove temelde aynı işi yapar ve normal bir kullanımda %99 aynı çıktıyı verecektir. 
Ancak memmove önemli bir duruma karşı önlem alır, "overlap" veya üst üste binme void *memmove(void *dest, const void *src, size_t n); ve void *memcpy(void *dest, const void *src, size_t n); şeklinde tanımlanır. 
src'in karakterlerini belirtilen sayı kadar dest'in karakterleriyle değiştirir. 
örneğin: memcpy("burak", "selam", 3) -> çıktısı selak olacaktır. yani strcpy gibi çalışır, ancak null kontrolü yapmaz. 
Overlap durumu ise karakterlerin üst üste binmesi durumudur. 

strlcpy ve strlcat
iki fonksiyon da bir dest, bir src, bir de sayı alır. 
strlcpy aynı memcpy gibi kopyalama işlemi yaparken (tek farkı null'u kontrol eder) 
strlcat iki stringi ard arda birleştirir. örneğin: strlcat("burak", "selam", 6) -> "burakselam" olacaktır. 
DİKKAT: srtlcat fonksiyonuna 6 sayısını verirsem 5 tane kopyalayacaktır. iki fonksiyon da hep bir eksiği kadar işlem yapacaktır çünkü en son karaktere null koyacağını garantilemeni ister.

toupper ve tolower
isimlerinden de anlaşılacağı üzere ona gönderilen tek bir karakteri küçültüp büyültür. 
upper büyültürken lower küçültür. 
int toupper(int c); şeklinde tanımlanırlar.

memchr
Aranan harfe kadar tarar bulduktan sonra ondan itibaren geri kalanı stringde yazdırır.
strchr ile aynı işlevi görür void *memchr(const char *s, int c, size_t n); şeklinde tanımlanır, n kadar byte'da arama yapar.

strnstr
needle(iğne)'yi haystack(samanlık)'da len kadar arar, bulduğu zaman devamını da döndürür.
iki adet string alır, ilk aldığı stringin içerisinde ikinci stringi arar. eğer bulursa oranın adresini return eder.

Atoi
ismi array to integer'dan gelir. 
Gönderilen stringdeki sayısal ifadeyi int haline çevirip return eder. - ve + durumlarını da kontrol eder. int atoi(const char *str); şeklinde tanımlanır.

calloc
calloc, malloc'a çok benzer. 
void *calloc(size_t nmemb, size_t size); şeklinde tanımlanır. 
İki parametre alır, çarpımları kadar bellekte yer açar, bellekte açtığı yerin içerisini malloc'tan farklı olarak "null" karakter ile doldurur ve bunu return eder.

strdup
parametre olarak bir string alır, bu stringi duplicate eder. Ama bunu yaparken o string için malloc ile yer açar ve bunu bize return eder. 
char *strdup(const char *s); şeklinde tanımlanır.
 
Devamı yazılacak
 

Yorumlar