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.
Last updated
Was this helpful?