Warning: Undefined array key "HTTP_ACCEPT_LANGUAGE" in /var/www/vhosts/bilgigunlugum.net/httpdocs/index.php on line 43
C Programlama

BG MVC Model View Controller eğitim serisi yayında...

Ana sayfa > Programlama > C Programlama > C standart kütüphanesi > <stdio.h> > scanf

scanf() fonksiyonu

Bildirim

int scanf(const char *format, ...);

int scanf(const char *restrict format, ...); (C99)

int scanf_s(const char *restrict format, ...); (C11)

Açıklama

Standart girişten (stdin) veri okur. Stdin genellikle klavyeyi ifade eder.

Klavyeden girilen değerleri, format parametresi ile gösterilen karakter dizisindeki format tanımlayıcılarının sırasına ve veri yapısına uygun olarak, üç nokta (...) ile ifade edilen ve format parametresinden sonra aynı sırayla yer alan değişken parametrelere aktarır.

Fonksiyonun format parametresi " " karakterleri 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.

Format tanımlayıcıları, format parametresinden sonra yer alan parametreler tarafından adresleri gösterilen değişkenlere klavyeden okunan bilgilerin hangi yapıda atanacağını belirler. Fonksiyon 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.

int scanf (const char *format, par1, par2, ...);

Ancak, burada dikkat edilmesi gereken 2 önemli nokta vardır:

1. Format parametresi ile gösterilen kontrol dizisi içinde yer alan format tanımlayıcısı kadar par ifadesi ile gösterilen parametre tanımlanmalıdır.

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

Scanf_s() fonksiyonu aynı işlemleri yapar. Farklı olarak, %c, %s ve %[ format tanımlayıcıları ikişer adet parametre girilmesini gerektirir. Bu değerlerin birisi normal değişken adresi diğeri ise değerleri alan dizinin boyutunu gösteren rsize_t veri türünde bir değerdir. Çalışma zamanında aşağıdaki hatalar tespit edildiğinde, yüklenmiş olan kısıtlayıcı işlem fonksiyonu çağrılır:

  • Parametrelerden herhangi biri NULL bir işaretçi ise,
  • Format parametresi NULL bir işaretçi ise,
  • %c, %s veya %[ tarafından yazılacak karakter sayısı, sonda yer alan boş karakter de dahil olmak üzere, bu format tanımlayıcıların her biri için tanımlanan ikinci (rsize_t) parametre değerinden fazla olursa,
  • Tespit edilebilen diğer hatalar oluşursa.

Parametreler

format: Standart girişten okunacak değerlerin aktarılacağı ve format tanımlayıcılar içeren bir karakter dizisidir.

Bu karakter dizisi stdin'den okunacak olan metni içerir. Karakter dizisi içinde normal karakterler veya % karakteri ile başlayan ve format karakter dizisinden sonra gelen parametreler ile doldurulacak olan format tanımlayıcıları yer alabilir.

Format içinde yer alan her bir değerin genel yapısı:

%[*][genişlik][uzunluk]format tanımlayıcısı

Bu fonksiyon için bir format tanımlayıcısı toplam 5 farklı ifadeden oluşmaktadır. En baştaki % işareti ile en sonda yer alan format tanımlayıcı harfi mutlaka kullanılmalıdır. [] işaretleri arasında yer alan diğer üç ifade isteğe bağlı olarak kullanılır.

% : Mutlaka tanımlanması gereken bu karakter format parametresinin değeri içinde yer alan ve fonksiyona geçirilecek parametrelere atanacak değerlerin yapısını gösteren her bir değerin başlangıcını gösterir.

* : İsteğe bağlı olarak tanımlanan bu karakter verilerin akıştan okunması gerektiğini ancak göz ardı edildiğini, yani karşılık gelen argümanda depolanmadığını gösterir.

genişlik : İsteğe bağlı olarak tanımlanan bu değer geçerli okuma işleminde okunacak maksimum karakter sayısını gösterir.

uzunluk : İsteğe bağlı olarak tanımlanan bu değer okutulacak argümanın boyutunu gösterir. hh, h, l, ll, j, z, t, L değerlerinden biri kullanıldığında, karşılık gelen argümanın gösterdiği kaydetme tipini değiştirir.

Uzunluk değeri Format tanımlayıcısı Okunacak değer
(Yok) c, s, [grup] char*
d, i, u, o, x, X, n signed int* veya unsigned int*
a, A, e, E, f, F, g, G float*
p void**
h d, i, u, o, x, X, n signed short* veya unsigned short*
hh (C99) d, i, u, o, x, X, n signed char* veya unsigned char*
j (C99) d, i, u, o, x, X, n intmax_t* veya uintmax_t*
l c, s, [grup] wchar_t*
d, i, u, o, x, X, n signed long* veya unsigned long*
a, A, e, E, f, F, g, G double*
L a, A, e, E, f, F, g, G long double*
ll (C99) d, i, u, o, x, X, n signed long long* veya unsigned long long*
t (C99) d, i, u, o, x, X, n ptrdiff_t*
z (C99) d, i, u, o, x, X, n size_t*

format tanımlayıcısı : Mutlaka tanımlanması gereken bu değer format içindeki her bir değerin ne şekilde okutulacağını belirler.

Format tanımlayıcı Karşılığı
c Karakter
d signed int
i signed 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 unsigned 8'lik sayı
s Karakter dizisi
u unsigned int
x unsigned 16'lık sayı (Küçük harf)
X unsigned 16'lık sayı (Büyük harf)
p İşaretçi
n Okunan karakter sayısını içeren int bir değer alır.
[ ] Bir karakter setini tarar.
% % karakterini ifade eder.

... : Format parametresi ile gösterilen karakter dizisinde yer alan ve % karakteri ile başlayan her bir format tanımlayıcı için, format karakter dizisinden sonra bir parametre tanımlanması gerekir.

Dönüş değeri

Başarı durumunda, fonksiyon okunan değerlerin başarıyla aktarıldığı değişken parametre sayısını döndürür. Bu sayı beklenen eşleşme sayısıyla aynı olabilir veya eşleşme hatası, okuma hatası veya dosya sonu erişiminden dolayı sıfır değeri de dahil olmak üzere daha düşük olabilir.

Bir okuma hatası meydana gelirse veya okuma sırasında dosyanın sonuna ulaşılırsa, uygun gösterge ayarlanır (feof veya ferror). Herhangi bir veri başarıyla okunmadan önce bu iki durumdan biri gerçekleşirse, EOF değeri döndürülür.

Scanf_s() fonksiyonu ayrıca, çalışma zamanı kısıtı ihlali varsa EOF değerini de geri döndürür.

Örnek


#include <stdio.h>

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

    printf("Bir karakter dizisi giriniz: ");
    scanf("%s", cdizi);

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

    printf("%s %d", cdizi, id);

    return 0;
}

Yukarıdaki örnekte, eğer klavyeden "Bilgisayar" ve 21 değerlerini girerseniz, program aşağıdaki satırları ekrana yazar:

Bir karakter dizisi giriniz: Bilgisayar
int bir değer giriniz: 21
Bilgisayar 21