Kullanıcıdan Input Alma - C Programlama Dili

in #tr5 years ago (edited)

C dili derslerinin bu dersinde kullanıcıdan input alma üzerine duracağım. Yazılan programlar, nihayetinde kullanıcıların kullanımı için yazılıyor. Hal böyle olunca kullanıcıdan veri istemek çok doğal bir süreç haline geliyor. Neyse bu kadar giriş sanırım yeterli. Bu dersimizde C dilinde kullanıcıdan input almak için kullanılan şu fonksiyonların anlatımını ve uygulamalarını bulacaksınız :

  • getchar() fonksiyonu
  • getche() fonksiyonu
  • getch() fonksiyonu
  • scanf() fonksiyonu
  • gets() fonksiyonu

getchar() Fonksiyonu

getchar() fonksiyonu klavyeden bir karakterlik veri okumak için kullanılır. Bu fonksiyon, standart input output kütüphanesi içerisinde bulunup stdio.h header dosyası içerisinde tanımlanmıştır. Dolayısıyla bu fonksiyonu kullanmak için bu header dosyasını kodumuza dahil etmeliyiz.

Bu fonksiyon çağrıldığında klavyeden bir karakter girilmesini bekler.( cursor yanıp söner). Girilen karakter ekrana yazılır ama fonksiyonun karakteri okuması için Enter tuşuna basmanız gerekir. Enter tuşuna bastığınızda karakter bellekteki değişkene atanır ve program bir sonraki satıra/statements geçer. Süreç böyle. Şimdi de uygulamasına bakalım.

Uygulamamızı çalıştırdığımızda aşağıdaki gibi bir çıktı alırız :

Görüldüğü gibi ekrana ilk olarak "Yapılan işlemi onaylıyor musunuz (Y/N) : sorusu geliyor. Sonrasında kullanıcı y harfine basıp Enter'a bastığında girilen karakter cevap değişkenine atanıyor. Son olarak cevap değişkenin değeri printf fonksiyonu kullanılarak ekrana yazılıyor.

Görüldüğü gibi getchar() fonksiyonu, Enter tuşuna basana kadar işlem yapmayacaktır. Peki Enter’a basana kadar birden fazla karaktere basarsanız ne olur, bundan bahsedelim.

getchar() fonksiyonu, siz klavyeden Enter tuşuna basana kadar girdiğiniz tüm değerleri klavyenin tampon belleğine atar. Ve sadece ilk girilen karakteri okur.  Ancak siz peş peşe getchar() fonksiyonunu çağırırsanız sırayla gelen karakterleri  çağrılan fonksiyonlara atayacaktır.

Örnek üzerinden gidelim :

Uygulamamızın çıktısı aşağıdaki gibidir :

Uygulamanın başında char yani karakter tipinde 3 değişken tanımladık : c1, c2, c3. Sonrasında printf fonksiyonu kullanarak kullanıcıdan 3 karakter girmesini istedik : ets. Daha sonra 3 adet getchar() fonksiyonu çağırıp bunlardan gelen karakterleri c1,c2 ve c3 e atadık. Ve uygulamanın sonunda bu değişkenlerin içeriğini ekrana yazdırmış olduk.

Umarım bu fonksiyon anlaşılmıştır.

getche() Fonksiyonu

getche() fonksiyonu, temel olarak getchar() fonksiyonu ile aynı işi yapar. Yani klavyeden tek bir karakter okur. getchar() fonksiyonundan farkı , Enter tuşuna basılmasını beklemez. Kişi, bir karakter girer girmez girilen karakteri belirlenen değişkene atar ve klavyeden okuma işlemi sona erer. Uygulama bir sonraki statement dan devam eder. Son bir şey bu fonksiyonu kullanabilmek için conio.h dosyasını include etmek gerekir.

Şimdi de uygulamasını görelim :

Uygulamamızın çıktısı aşağıdaki gibidir :

Klavyeden 'y' karakterini basar basmaz, Enter a basmamıza gerek kalmadan uygulama bir sonraki satırdan devam edip ekrana atanan karakteri basmış oldu.

Bu fonksiyonun çoklu kullanımı(birden fazla karakter okuma) ise aşağıdaki gibidir :

Çıktımız :

getch() Fonksiyonu

getch() fonksiyonu da diğer 2 fonksiyon gibi klavyeden tek karakter okumak için kullanılır. Çalışma prensibi olarak getche() fonksiyonunun birebir aynısıdır. Ancak getch() fonksiyonunda girilen karakter, girildiğinde ekranda gözükmez. Linux sistemlerde şifre girdiğiniz zamanları düşünün.

Yukarıdaki uygulamayı hiç değiştirmeden bu fonksiyon için uyarlarsak, farkı daha iyi anlarız.


Görüldüğü gibi kullanıcının klavyeden girdiği "ets" karakterleri çıktıda gözükmemektedir. Bunun amacını sorgulayanlar için belirteyim, şifre işlemlerinde şifrenin gözükmemesini sağladığından tamamen güvenlik amaçlıdır.

scanf() Fonksiyonu

scanf() fonksiyonu, klavyeden girilen değeri almak için kullanılır. Bu değer her şey olabilir, bir kısıtlama yok yani. Klavyeden girilen değer int ya da benzeri bir tip ise %d, float ise %f, karakter ise %c ve string ise %s ifadeleri kullanılır. Standart Input Output kütüphanesinin elemanı olduğundan farklı bir kütüphaneye gerek yoktur.

Kullanımında yukarıdaki % ifadeleri çift tırnak içerisinde “” verilirken, değişkenin kendi yerine adresi anlamına gelen &degisken_ismi kullanılır.

scanf("%d", &degisken_ismi);

Program scanf( ) fonksiyonuna geldiğinde kullanıcıdan Enter’a basılmasını bekler. Basıldıktan sonra girilen değer bellekteki değişkene atanır ve program bir sonraki statement a geçer.

Şimdi bir uygulama ile int, float ve character değer okuması yapalım :

Uygulamamızın çıktısı aşağıdaki gibidir :

Bu uygulamada dikkat edilmesi gereken kısım; peşpeşe int, float gibi verileri okuttuktan sonra bufferı boşaltmadan char okutmaya kalkışmaktır.

Kod kısmında herhangi bir sorun gözükmese de char okumaya geldiğinde char değişkenine değer atamak için bizden değer almayacak hali hazırda bufferda bulunan enter ‘\n’ karakterini atayacaktır. Bunu aşmanın iki yolu vardır.

1.Yol : Yukarıdaki koddaki gibi char değişkeni okunacaksa okuma işlemi sırasında scanf içerisinde %c karakterinden önce bir boşluk bırakmaktır.

2.Yol : İki scanf() arasında fflush(stdin); fonksiyonunu çağırarak tampon belleği boşaltmaktır. (Bu yol bende çalışmadı sebebini anlamadım. İlerde bulursam paylaşırım.)

Şimdi de scanf() fonksiyonu ile string okuma işlemi nasıl yapılır ondan bahsedelim. Öncesinde Stringler ile alakalı ufak bir bilgi verelim.

Daha öncesinde değişkenler dersinden gördüğümüz üzere C dilinde String adında bir veri tipi yok. Bunun yerine “Stringler, aslında karakter dizileridir” tanımına uyarak char tipinde diziler kullanırız, string değer tutmak için. Stringlerde son karakter “\0” null karakteridir. Yani derleyici bu karakteri görünce string in sonuna geldiğini anlar. (End Of File EOF gibi) Dolayısıyla eğer okumak istediğimiz text ifade 40 karakterli ise bizim oluşturacağımız dizi 41 karakter olmalıdır.

Şimdi uygulama kısmına geçelim :

Çıktımız ise şöyledir :

Kodlama kısmında scanf() kullanımı ile alakalı ampersand & işaretinin kullanılmadığını görüyoruz. Bunun sebebi dizilerde dizi adreslerinin dizi ismi olmasından ileri geliyor.

Sonuca baktığımızda ise string ifade olarak "Ali Veli Deli" girmemize rağmen çıktıda sadece "Ali" ismini gördük. Bunun sebebi

"scanf() fonksiyonunun girilen string değerde boşluk karakterine kadar okuma yapmasıdır. "

Bu şekilde düşündüğümüzde Ali isminden sonra boşluk değerini gördüğünde okuma işlemini bırakacaktır.

scanf() fonksiyonuna boşlukları da okutmak isterseniz %s yerine %[^\n]s ifadesini kullanmalısınız.

Bu haliyle aynı uygulamayı düzenleyelim :

Çıktımız ise şöyle olacaktır :

Görüldüğü gibi scanf() fonksiyonu ile komple bir string değeri okutabildik.

String okuma noktasında scanf() fonksiyonuna alternatif bir fonksiyon var. Dersimizi bitirmeden önce ondan da bahsetmek istiyorum.

gets() Fonksiyonu

gets() fonksiyonu, klavyeden girilen string değerleri okumak için kullanılır. Klavyeden Enter'a basılana kadar olan tüm değerleri tek bir string ifade kabul ederek alır. Ancak dizi boyutu kontrolü yapmama gibi bir dezavantajı vardır.

Uygulamasını görelim. Bu uygulamada printf() alternatifi olan puts() fonksiyonu kullanılacaktır.

Çıktımız ise aşağıdaki gibidir :

Son uygulamamız ile gets() fonksiyonunun da kullanımını öğrenmiş olduk.

Bugünlük bu kadar, umarım faydalı bir çalışma olmuştur.

Uygulama noktasında herhangi bir sorun yaşarsanız aşağıdaki yorum panelini kullanarak iletişime geçmekten çekinmeyin lütfen. Teşekkürler.

Kaynak belirtilmeyen görseller @etasarim a aittir. / Pictures that don’t have any source belongs to @etasarim.


Posted from my blog with SteemPress : http://etasarim.cloudaccess.host/01/03/2019/kullanicidan-input-alma-c-programlama-dili/
Sort:  

Steempress kullananlara duyrulur, sakın code tagini kullanmak gibi bir hataya düşmeyin. Tüm postun stilini bozuyor.

This post has received a 40.45 % upvote from @boomerang.

You got a 6.15% upvote from @minnowvotes courtesy of @etasarim!

Kullanıcıdan input almak için kullanılan daha başka fonksiyonlarda var elbette. Ama ben bu yazıda en çok kullanılanlara değinmeye çalıştım. Derste yer alan puts() fonksiyonunu ele alalım mesela. Bu fonksiyon kullanımsal farklılıklarla beraber, printf fonksiyonunun alternatifidir.

You got a 26.32% upvote from @brupvoter courtesy of @etasarim!

Congratulations! This post has been upvoted from the communal account, @minnowsupport, by etasarim from the Minnow Support Project. It's a witness project run by aggroed, ausbitbank, teamsteem, someguy123, neoxian, followbtcnews, and netuoso. The goal is to help Steemit grow by supporting Minnows. Please find us at the Peace, Abundance, and Liberty Network (PALnet) Discord Channel. It's a completely public and open space to all members of the Steemit community who voluntarily choose to be there.

If you would like to delegate to the Minnow Support Project you can do so by clicking on the following links: 50SP, 100SP, 250SP, 500SP, 1000SP, 5000SP.
Be sure to leave at least 50SP undelegated on your account.

Hi, @etasarim!

You just got a 1.58% upvote from SteemPlus!
To get higher upvotes, earn more SteemPlus Points (SPP). On your Steemit wallet, check your SPP balance and click on "How to earn SPP?" to find out all the ways to earn.
If you're not using SteemPlus yet, please check our last posts in here to see the many ways in which SteemPlus can improve your Steem experience on Steemit and Busy.

Congratulations @etasarim! You have completed the following achievement on the Steem blockchain and have been rewarded with new badge(s) :

You received more than 100 as payout for your posts. Your next target is to reach a total payout of 250

Click here to view your Board
If you no longer want to receive notifications, reply to this comment with the word STOP

To support your work, I also upvoted your post!

Do not miss the last post from @steemitboard:

Carnival Challenge - Collect badge and win 5 STEEM

You can upvote this notification to help all Steem users. Learn how here!


Bu yazı Curation Collective Discord Sunucusunda küratörlere önerilmiş ve manuel inceleme sonrasında @c-squared topluluk hesabından oy ve resteem almıştır.
This post was shared in the #turkish-curation channel in the Curation Collective Discord community for curators, and upvoted and resteemed by the @c-squared community account after manual review.
@c-squared runs a community witness. Please consider using one of your witness votes on us here

Coin Marketplace

STEEM 0.29
TRX 0.12
JST 0.033
BTC 63373.75
ETH 3170.63
USDT 1.00
SBD 3.88