C Programlama

Ek Bilgiler

C'de Konsol İşlemleri

► Detaylı anlatım

Konsol işlemleri klavye ve ekran ile gerçekleştirilen işlemleri kapsar. C'de toplam 6 adet temel giriş çıkış fonksiyonu ile her tür veriye işlem yapabilen printf() ve scanf() fonksiyonları kullanılmaktadır.

Temel konsol giriş çıkış fonksiyonları aşağıda yer almaktadır:

Fonksiyon   İşlevi

getchar()   Girilen karakteri okuma işlemi için ENTER tuşuna basılması gerekir.
getche()    Karakter girilir girilmez okuma işlemi gerçekleşir.
getch()     getche() fonksiyonundan tek farkı girilen karakterin ekrana yazılmamasıdır.
putchar()   Bir karakteri ekrana yazar.
gets()      KLavyeden bir karakter dizisi okur.
puts()      Bir karakter dizisini ekrana yazar.

getchar() fonksiyonunu kullanarak klavyeden karakter girmeniz gerekirken, karakter girmek yerine ENTER tuşuna basarsanız, getchar() fonksiyonu \n karakterini geri verir.

getchar() fonksiyonu klavyeden girdiğiniz karakteri, int bir değere çevrilen unsigned char bir değer olarak okur. Programınız, klavyeden okunan değeri genellikle char bir değişkene atar. Bu durumda int değerin en solda kalan biti devre dışı kalır.

Ancak, getchar() fonksiyonu int bir değer geri verir, çünkü klavyeden karakter okunurken bir hata meydana geldiğinde getchar() fonksiyonunun geri verdiği EOF makrosu genellikle -1 olan negatif bir int değerdir.

EOF makrosu stdio.h başlık dosyası içinde tanımlıdır. Sonuç olarak, klavyeden yapılan okuma işleminde bir hata meydana geldiğinde getchar() fonksiyonunun EOF değerini geri vermesi için int bir değer geri vermesi gerekir.

putchar() fonksiyonu ise, ekrana tek bir karakter yazar. putchar() fonksiyonunun parametresi int bir değerdir, ancak bu değer fonksiyon tarafından unsigned char bir değere çevrilir. Eğer işlem başarılı olursa, putchar() fonksiyonu parametre olarak verilen karakteri, aksi takdirde EOF makro değerini geri verir.

Şimdi getchar() ve putchar() fonksiyonlarının birlikte kullanıldığı örnekleri incelemeye çalışalım:

#include <stdio.h>

void main (void)
{
  char cd1;

  printf("Tek bir karakter girip ENTER tuşuna basınız: ");
  
  cd1 = getchar();

  putchar(cd1);
}

Yukarıdaki örnekte, program klavyeden girilen karakteri getchar() fonksiyonu ile cd1 değişkenine atar ve putchar() fonksiyonu ile değişken değerini ekrana yazar.

conio.h başlık dosyasını kullanan getche() ve getch() fonksiyonlarının genel yapıları aşağıdaki şekildedir:

int getche (void);
int getch (void);

getche() fonksiyonu tıpkı getchar() fonksiyonu gibi klavyeden yazılan tek bir karakter okur. Klavyeden bir karakter girilir girilmez okur, bir bellek değişkenine atar. Ayrıca ENTER tuşuna basılmasına gerek yoktur. Klavyeden girilen karakter unsigned char bir değer olarak okunur ve int bir değere çevrilir. Sonuçta, klavyeden okunan değer char bir değişkene atanır. Bu fonksiyonu bir örnek üzerinde incelemeye çalışalım:

#include <stdio.h>
#include <conio.h>

void main (void)
{
  char cd1;

  printf("Bir karakter giriniz: ");
  cd1 = getche();

  putchar(cd1);
}

Yukarıdaki örnekte, program bir karakter girdiğinizde, girdiğiniz karakteri ekrana yazar cd1 değişkenine atar. Son olarak program putchar() fonksiyonunu kullanarak cd1 değişken değerini ekrana yazar.

getch() fonksiyonu da tıpkı getche() fonksiyonu gibi klavyeden yazılan tek bir karakter okur. getch() fonksiyonunu getche() fonksiyonundan ayıran en önemli özellik girdiğiniz karakteri ekrana yazmamasıdır. Şimdi, bu fonksiyonu da bir örnek üzerinde inceleyelim:

#include <stdio.h>
#include <conio.h>

void main (void)
{
  char cd1;

  printf("Bir karakter giriniz: ");
  cd1 = getch();
  printf("\n");

  putchar(cd1);
}

Yukarıdaki örnekte, program bir karakter girdiğinizde, girdiğiniz karakteri ekrana yazmadan cd1 değişkenine atar. Son olarak program putchar() fonksiyonunu kullanarak cd1 değişken değerini ekrana yazar.

Şimdi, klavyeden girilen karakter dizilerini okutmak için kullanılan gets() fonksiyonu ile karakter dizilerini ekrana yazmak için kullanılan puts() fonksiyonunu incelemeye çalışalım. stdio.h başlık dosyasını kullanan her iki fonksiyonun genel yapıları aşağıdaki şekildedir:

char *gets (char *cdizi);
int puts (char *cdizi);

gets() fonksiyonu, ENTER tuşuna basılana kadar, klavyeden girilen karakterleri okur ve cdizi dizisine atar. En son basılan ENTER tuşu, karakter dizisine NULL bir sonlandırıcı olarak dahil edilir. Eğer gets() fonksiyonu karakter dizisini hatasız olarak okursa, cdizi dizi başlangıcını gösteren bir işaretçi değeri geri verir. Eğer işlem hatalı olarak sona ererse, gets() fonksiyonu boş bir işaretçi geri verir.

puts() fonksiyonu, cdizi dizisi ile gösterilen karakter dizisini ekrana yazar. Bu işlemi yaparken, karakter dizisinin sonuna otomatik olarak bir satır başı ve satır aralığı karakteri (CR/LF) ekler. Eğer puts() fonksiyonu karakter dizisini hatasız olarak ekrana yazarsa, negatif olmayan bir değer, aksi takdirde EOF değerini geri verir.

Şimdi, gets() ve puts() fonksiyonlarının kullanılmasını örneklerle incelemeye çalışalım:

#include <stdio.h>

void main (void)
{
  char cdizi[40];
  int id1;

  printf("Bir karakter dizisi giriniz: ");
  id1 = gets(cdizi);
  if (id1) puts(cdizi);  /* 1 */
}

Yukarıdaki örnekte, program klavyeden girilen bir karakter dizisini cdizi adlı diziye atar. gets() fonksiyonunun geri verdiği değeri ise id1 adlı değişkene atar. id1 değişken değeri doğru bir sonuç verirse, 1 sayısı ile gösterilen işlem satırında cdizi dizisini ekrana yazar.

C'de veri tiplerine işlem yaparak klavyden okumak için scanf() fonksiyonu, ekrana yazdırmak için ise printf( ) fonksiyonu kullanılır.

printf() Fonksiyonu

printf() fonksiyonunun genel yapısı aşağıdaki şekildedir:

int printf (char *kontrol-dizisi, par1, par2, ...);

printf() fonksiyonunun ilk parametresi kontrol-dizisi ifadesi ile gösterilen ve Kontrol Dizisi adı verilen bir karakter dizisidir. printf() fonksiyonu, " " işaretleri arasında yer alan bu karakter dizisini ekrana yazar.

Kontrol dizisinin içinde hem normal karakterler hem de (%) işareti ile başlayan format tanımlayıcıları adı verilen ifadeler yer alabilir. printf() fonksiyonu " " işaretleri arasında yer alan normal karakterleri sıra ile ekrana yazar. Kontrol dizisi içinde yer alan her bir format tanımlayıcısı için par ifadesi ile gösterilen bir değer tanımlanır. Ancak, burada dikkat edilmesi gereken 2 önemli nokta vardır:

1. Kontrol dizisi içinde yer alan format tanımlayıcısı kadar par ifadesi ile gösterilen argüman tanımlanmalıdır.

2. Her argümanın veri türü kendisine karşılık gelen format tanımlayıcısının veri türüne uygun olmalıdır.

par ifadesi ile gösterilen argümanlar bir değişken, sabit, ifade veya bir fonksiyon çağrısı olabilir.

printf() fonksiyonu, ekrana yazdığı karakter sayısını int bir değer olarak geri verir. printf() fonksiyonunun çalışmasında bir hata meydana gelirse, fonksiyon negatif bir sayı geri verir.

printf() fonksiyonunun çalışma prensibini farklı kelimelerle tekrar ifade etmek gerekirse:

Fonksiyon çalışmaya başladığında, önce kontrol dizisi içinde yer alan ilk karaktere bakar. Eğer normal bir karakter ise hemen ekrana yazar. Eğer bir format tanımlayıcısı ise, bu format tanımlayıcısına karşılık gelen ilk argüman değerini ekrana yazar. Kontrol dizisi içindeki bütün karakterleri sıra ile bu şekilde kontrol edip işlem yaptıktan sonra çalışması sona erer.

Format tanımlayıcıları kendilerine karşılık gelen argümanların ekrana nasıl yazılacağını belirler. printf() fonksiyonu format tanımlayıcıları ile karşılaştığında ekrana farklı bir veri yazacağını ve bu verinin printf() fonksiyonu çağrılırken karakter dizisinden sonra tanımlanmış olan argüman değerlerinden sıra ile alınacağını anlar.

printf() fonksiyonu ile kullanılmakta olan format tanımlayıcıları aşağıdaki tabloda yer almaktadır:

  Kod  Format

  %c   Karakter
  %d   İşaretli int
  %i   İşaretli int
  %e   Bilimsel gösterim
  %E   Bilimsel gösterim
  %f   Ondalıklı sayı
  %g   %e ve %f'den kısa olanı kullanır.
  %G   %E ve %f'den kısa olanı kullanır.
  %o   İşaretsiz 8'lik sistem
  %s   Karakter dizisi
  %u   unsigned int
  %x   unsigned 16'lık sistem (Küçük harf)
  %X   unsigned 16'lık sistem (Büyük harf)
  %p   İşaretçi
  %n   Karşılık gelen argüman ekrana yazılan karakterlerin sayısının atandığı int bir 
       değeri gösteren bir işaretçi olmalıdır.
  %%   % işaretini ekrana yazar.
#include <stdio.h>

void main (void)
{
  int id1;
  char cdizi[20];

  id1 = 21;
  strcpy(cdizi, "Fonksiyonlar");

  printf("%d %s", id1, cdizi);
}

Yukarıdaki örnekte, program aşağıdaki satırları ekrana yazar:

21 Fonksiyonlar

scanf() Fonksiyonu

scanf() fonksiyonunun genel yapısı aşağıda gösterilmektedir:

int scanf (char *kontrol dizisi,...);

Nokta işaretleri fonksiyon parametrelerini gösterir. scanf() fonksiyonu klavyeden girilen verileri okuyarak belirli değişkenlere atar.

scanf() fonksiyonuna geçirilen ilk argüman " " işaretleri ile arasında tanımlanan bir karakter dizisidir. Kontrol dizisi olarak adlandırılan bu karakter dizisinin içinde hem normal karakterler hem de (%) işareti ile başlayan format tanımlayıcıları adı verilen ifadeler yer alabilir. scanf() fonksiyon format tanımlayıcıları, scanf() fonksiyonunun, kontrol dizisinden sonra yer alan argümanlar (değişken adresleri) tarafından adresleri gösterilen değişkenlere klavyeden okuduğu bilgileri hangi yapıda atayacağını belirler. scanf() fonksiyonunun kontrol dizisi içinde tanımlanan format tanımlayıcı sayısı kadar argüman tanımlanması gerekir. scanf() fonksiyonu bir format tanımlayıcısı ile karşılaştığında, klavyeden bir veri okuyacağını ve bu verinin format tanımlayıcısına karşılık gelen argümanda adresi gösterilen değişkene atanacağını anlar. Kontrol dizisi içinde yer alan karakterlerin kullanılmasını birazdan inceleyeceğiz.

scanf() fonksiyonu ile kullanılmakta olan format tanımlayıcıları aşağıdaki tabloda yer almaktadır:

Kod  Format

%c   Tek bir karakter okur
%d   int bir değer okur
%i   int bir değer okur
%e   float bir değer okur
%f   float bir değer okur
%g   float bir değer okur
%o   İşaretsiz 8'lik bir sayı okur
%s   Bir karakter dizisi okur
%x   İşaretsiz 16'lık bir sayı okur
%p   Bir işaretçi değeri okur
%n   Okunan karakter sayısını içeren int bir değer alır
%u   İşaretsiz bir int değer okur
%[]  Bir karakter setini tarar

scanf() fonksiyonu bellek adresleri argüman olarak verilen değişkenlere atanan değer sayısını geri verir. Fonksiyonun çalışmasında herhangi bir hata meydana gelirse, EOF değerini geri verir.

#include <stdio.h>

void main (void)
{
  int id1;

  printf("int bir değer giriniz: ");
  scanf("%d", &id1);

  printf("Girdiğiniz değer: %d", id1);
}

Yukarıdaki örnekte, girilen int bir değeri ekrana yazar.