Bildirim
int sscanf(const char *buffer, const char *format, ...);
int sscanf(const char *restrict buffer, const char *restrict format, ...); (C99)
int sscanf_s(const char *restrict buffer, const char *restrict format, ...); (C11)
Açıklama
Bir karakter dizisinden verileri okuyarak değişkenlere atar.
Buffer parametresi ile gösterilen karakter dizisinden okunan 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 buffer karakter dizisinden okunan bilgilerin hangi yapıda atanacağını belirler. Fonksiyon bir format tanımlayıcısı ile karşılaştığında, buffer karakter dizisinden 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 sscanf (const char *buffer, FILE *stream, 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.
Sscanf_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:
Parametreler
buffer: Verilerin okunacağı karakter dizisidir.
format: Buffer parametresinden okunacak değerlerin aktarılacağı ve format tanımlayıcılar içeren bir karakter dizisidir.
Bu 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ından dolayı sıfır değeri de dahil olmak üzere daha düşük olabilir.
Herhangi bir veri başarılı bir şekilde okunmadan önce hata oluşursa, EOF değeri geri döndürülür.
Sscanf_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)
{
int id;
float fd;
char cdizi[40];
char buffer[100];
sprintf(buffer, "%d %.2f %s", 36, 121.45, "Bilgisayar");
printf("Oluşturulan karakter dizisi: %s\n", buffer);
sscanf(buffer, "%d %f %s", &id, &fd, cdizi);
printf("Okunan karakter dizisi: %d %.2f %s", id, fd, cdizi);
return 0;
}
Yukarıdaki örnekte, program aşağıdaki satırları ekrana yazar:
Oluşturulan karakter dizisi: 36 121.45 Bilgisayar Okunan karakter dizisi: 36 121.45 Bilgisayar
Yukarıdaki program, sprintf() fonksiyonu ile bir karakter dizisine yazdığı bir int değer ve bir float değer ile bir karakter dizisini, sscanf() fonksiyonu ile karakter dizisinden okuyarak içeriklerini sıfırladığı değişkenlere atar ve değişken değerlerini ekrana yazar.