Temel C Programlama -42- stdlib.h ve stdio.h Başlık Dosyaları ile Karakter Dizisi İşlemleri

Karakter dizileri ile ilgili size anlatacağımız en son konu ise stdlib.h ve stdio.h kütüphane başlık dosyalarında yer alan karakter dizileri ile alakalı fonksiyonlardır. Bu fonksiyonlar arasında sıkça kullanacağınız ve önemli fonksiyonlar da yer almaktadır. Özellikle tamsayı, float veya diğer tipteki değişkenleri karakter dizisine çevirme veya karakter dizilerinin içinde yer alan tam sayı, ondalıklı sayı gibi değerleri aslına çevirme konusunda oldukça kullanışlı fonksiyonlar yer almaktadır. Karakter dizisi konusunda belki de size en çok lazım olacak fonksiyonlar bunlardır.

stdio.h başlık dosyası ve karakter dizisi işlemleri

stdio.h dosyası giriş ve çıkış işlemlerini yerine getiren fonksiyonları barındıran bir kütüphane dosyasıdır. Hepinizin şimdi bileceği gibi printf() ve scanf() fonksiyonları bu dosyaya dahildir. C dilinde kütüphane dosyaları kullanılmadan ekrana yazı bile yazdırılamayacağını söylemiştik. Nitekim bazı sistemlerde ekran olmayabilir ve ekrana yazı yazdırmaya hiç ihtiyaç duyulmayabilir. Bu durumda bunu dile eklemenin ne gereği olur? Python, BASIC gibi dillerde dile gömülü halde Print fonksiyonu olsa da bunun aslında gerekli olmadığını bilmeniz gerekli.

stdio.h başlık dosyasının karakter dizileri ile ilgili fonksiyonları şunlardır

 

sprintf Karakter dizisine formatlı bir şekilde yazdırır.
sscanf Karakter dizisinden formatlı bir şekilde okuma yapar.
vsprintf Değişken argüman listesinden okuduğu veriyi karakter dizisine yazdırır.
vsscanf Karakter dizisinden okuduğu veriyi değişken argüman listesine yazdırır.
fgets Dosya akışından karakter dizisini okur.
fgetc Dosya akışından karakteri okur.
fputc Dosya akışına karakter yazar.
fputs Dosya akışına karakter dizisi yazar.
getc Dosya akışından karakter dizisi okur
getchar stdin’den karakter okur
gets stdin’den karakter dizisi okur
putc Akışa karakter yazar.
putchar stdout’a karakter yazar.
puts stdout’a karakter dizisi yazar

Burada karakter dizileri ile alakalı fonksiyonlar olsa da pek çoğunun giriş ve çıkış fonksiyonu olduğunu ve karakter dizilerini argüman olarak kullandıklarını görmekteyiz. Burada önemli olan giriş ve çıkış fonksiyonlarını görsek de sizin için çok önemli olan yeni bir fonksiyondan bahsetmek istiyorum. O da sprintf() fonksiyonudur.

sprintf fonksiyonu

Siz bilgisayar üzerinde C programı yazarken işiniz kolaydır. Çünkü printf fonksiyonu ile istediğiniz değeri istediğiniz formatta kolaylıkla yazdırabilirsiniz. Elbette bu ASCII karakterleri ile sınırlı olsa da bazen sırf ASCII karakterleri kullanılarak oyun bile yapılabilmektedir. Biz gömülü sistemler üzerinde program yazarsak bunda printf fonksiyonunun kullanılamadığını görürüz. Çünkü gömülü sistemlerde çıkış alacağımız bir terminal veya ekran bulunmamaktadır. Biz genellikle sisteme bağladığımız bir parçaya bu değeri karakter dizisi formatında göndermek zorunda kalırız. Örneğin bir karakter LCD ekranı buradaki konsol ekranı gibi çıkış birimi olarak kullanabiliriz. Bunun için paralel veya seri iletişim yolundan karakter dizisindeki karakterleri (baytları) sırasıyla göndermemiz gerekebilir. Bunun için programdaki bütün tam sayı, ondalıklı sayı gibi değişken tiplerini karakter dizisine çevirip sonra bu diziyi yollamamız gerekir. Aslında bizim kullandığımız printf() fonksiyonu da aynı görevi yapmaktadır fakat çıkışı çıkış akışına otomatik olarak yöneltmektedir. Geri kalanı işletim sistemi üstlenmektedir. Gömülü sistemlerde genelde işletim sistemi olmadığı için çıkışı aldığımız karakter dizisini kendimiz yönlendirmek zorunda kalırız.

Örneğin PI sayısını sprintf ile yazdırmamız gerekirse şöyle bir komut yazarız.

Görüldüğü gibi bazen sistemlerde bir şey yazdırmak için printf() fonksiyonu yazmamız yeterli olmuyor. Bunun neden anlattığımı soracak olursanız siz C dilini ya sistem programcılığında ya da gömülü sistemlerde kullanmak üzere öğreniyorsunuz. C dili sadece bilgisayardaki konsol ekranına bir çift yazı yazdırmak için kullanılmaz. Pek çok fonksiyonu bazen kendiniz yazmanız gereklidir. Bunun içerisine donanım sürücülerini de dahil edebiliriz.

Ayrıca bazen gömülü sistemler için C derleyicilerinde standart kütüphane fonksiyonları kısıtlanmış halde olabilir. AVR-GCC’de ben bunu ondalıklı sayı dönüşümünde yaşadım. Aslına bakarsanız yukarıda verdiğim örnek kod normal haliyle sadece soru işareti karakterini bize verecekti. Bu durumda bağlayıcı (linker) ayarlarını değiştirerek ondalıklı dönüşümünü etkinleştirmemiz gerekli.

stdlib.h başlık dosyası ve karakter dizisi işlemleri

stdlib.h dosyasında standart genel araçlar yer almaktadır. Rastgele sayı süretmek, dinamik bellek tahsisi, çevre, arama ve sıralama, tamsayı aritmetiği gibi fonksiyonların yanı sıra karakter dizisi çevirimi fonksiyonları da yer almaktadır. Bazen kullandığınız donanım ve derleyiciye bağlı olarak standart dışı kütüphane fonksiyonları da bu tarz başlık dosyalarının içerisinde yer alabilir. Bunu derleyicinin belgelerinden okuyup öğrenmeniz gerekli. Örneğin AVR-GCC için dtostre() ve dtostrf() fonksiyonları ondalıklı sayıyı karakter dizisine dönüştürmekte. Siz standarta bağlı kalmak istiyorsanız sprintf() fonksiyonu ile formatlı bir şekilde dönüştürmelisiniz. stdlib.h başlık dosyasının karakter dizileri ile alakalı fonksiyonları şunlardır.

atof Karakter dizisini double değerine dönüştürür.
atoi Karakter dizisini integer değerine dönüştürür.
atol Karakter dizisini long integer değerine dönüştürür.
atoll Karakter dizisini long long integer değerine dönüştürür.
strtod Karakter dizisini double değerine dönüştürür.
strof Karakter dizisini float değerine dönüştürür.
strtol Karakter dizisini long integer değerine dönüştürür.
strtold Karakter dizisini long double değerine dönüştürür.
strtoll Karakter dizisini long long integer değerine dönüştürür.
strtoul Karakter dizisini unsigned long integer değerine dönüştürür.
strtoull Karakter dizisini unsigned long long integer değerine dönüştürür.

Bu fonksiyonları biz nerede kullanacağız diye soracak olursanız bunları kendimize ait veri transferi işlemlerini yaptığımız zaman kullanacağız cevabını veririz. sscanf() fonksiyonunu kullanmak da bir alternatif olsa da burada alınan karakter dizisi verisinin C diline göre formatlanmış olması şarttır. Biz farklı bir formatta veya formatsız bir şekilde bu veriyi alıp dönüşümü yapmamız gerekiyorsa bu fonksiyonları kullanabiliriz. Örneğin bilgisayarın seri portundan bir veri alırsak bu bize “50” şeklinde gelecektir ve bir formatı olmayacaktır. Bunu tam sayı olarak 50’ye çevirmek istiyorsak atoi fonksiyonunu kullanırız.

Bu noktaya kadar karakter dizileri hakkında anlatacağımız çok bir şey kalmadı. Bir sonraki konuda görüşmek üzere.

Bizi Facebook grubumuzda takip etmeyi unutmayın. Bilgili ve öğrenmeye hevesli bir topluluk oluşturmak istiyoruz.

https://www.facebook.com/groups/1233336523490761/

UYARI!!

 

Gökhan Dökmetaş

"Arduino Eğitim Kitabı" ve "Arduino ve Raspberry PI ile Nesnelerin İnterneti" kitaplarının yazarı. Başkent Teknoloji ve Dedektör Merkezi'nde Ar-ge Sorumlusu. Araştırmacı-Yazar.

You may also like...

Bir cevap yazın

E-posta hesabınız yayımlanmayacak.