Bildirim
int vsscanf(const char *buffer, const char *format, va_list arg); (C99)
int vsscanf(const char *buffer, const char *format, va_list arg); (C11)
Açıklama
Buffer parametresi ile gösterilen karakter dizisinden okuduğu verileri bir argüman listesi içinde tanımlanan değişken adreslerine aktarır.
Dosya akışından 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, format parametresinden sonra arg parametresi ile gösterilen listede aynı sırayla yer alan değişken adreslerine 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.
sscanf() fonksiyonunda format tanımlayıcılarına değer okutmak için format parametresinden sonra gelen ek parametreler kullanılırken vsscanf() fonksiyonunda arg parametre listesinde yer alan değişken adresleri kullanılmaktadır.
Her durumda, arg parametre değerine vsscanf() fonksiyonu kullanılmadan önce va_start() fonksiyonu tarafından bir ilk değer verilmiş olmalı ve fonksiyon kullanımından sonra ise va_end() fonksiyonu tarafından serbest bırakılmalıdır.
Format tanımlayıcıları, format parametresinden sonra yer alan arg parametresi ile gösterilen argüman listesinde adresleri gösterilen değişkenlere bir karakter dizisinden okunan bilgilerin hangi yapıda atanacağını belirler. Fonksiyon bir format tanımlayıcısı ile karşılaştığında, bir karakter dizisinden bir veri okuyacağını ve bu verinin arg parametresi ile gösterilen argüman listesinde format tanımlayıcı ile aynı sırada yer alan değişken adresine atanacağını anlar.
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 arg parametresi ile gösterilen liste içinde argüman tanımlanmalıdır.
2. Arg listesi içindeki 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.
Vsscanf_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: Format parametresinde oluşturulan karakter dizisinin okunacağı karakter dizisidir.
format: Dosya akışından okunacak değerlerin aktarılacağı ve format tanımlayıcılar içeren bir karakter dizisidir.
Bu karakter dizisi buffer parametresi ile gösterilen karakter dizisinden okunacak olan metni içerir. Karakter dizisi içinde normal karakterler veya % karakteri ile başlayan ve format karakter dizisinden sonra gelen arg parametre listesindeki değişken adreslerine aktarılacak 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. |
arg : va_start() ile ilk değer verilen değerler listesini tanımlayan bir değerdir.
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.
Bir okuma hatası meydana gelirse EOF değeri döndürülür.
Vsscanf_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>
#include <stdarg.h>
void ArgList(int write, char *buffer, const char * format, ...);
int main(void)
{
char buffer[100];
char cd;
int id;
float fd;
char cdizi[20];
/* Karakter dizisine yazma işlemi */
ArgList(1, buffer, "%c %d %.2f %s", 'P', 92, 843.25, "Bilgisayar");
/* Karakter dizisinden okuma işlemi */
ArgList(0, buffer, "%c %d %f %s", &cd, &id, &fd, cdizi);
printf("Karakter dizisinden okunan değerler: %c %d %.2f %s", cd, id, fd, cdizi);
return 0;
}
void ArgList(int write, char *buffer, const char *format, ...)
{
va_list args;
va_start (args, format);
if (write) vsprintf (buffer, format, args);
else vsscanf (buffer, format, args);
va_end (args);
}
Yukarıdaki örnekte, program aşağıdaki satırı ekrana yazar:
Karakter dizisinden okunan değerler: P 92 843.25 Bilgisayar
Program birer adet char, int, float ve karakter dizisi değeri oluşturur. Değerlere karşılık gelen format tanımlayıcılarını içeren bir karakter dizisi ile farklı değerleri kullanarak ArgList() fonksiyonunu karakter dizisine yazma amacıyla çağırır. Fonksiyon içinde va_start() ile oluşturulan argüman listesi ve format parametre değeri ile vsprintf() fonksiyonu çağrılarak karakter dizisine yazma işlemi yapılır. Daha sonra aynı işlemler vsscanf() fonksiyonu ile karakter dizisinden okuma amacıyla yapılır. Okunan değerler ekrana yazılır.