stdarg.h
- C kursu
- Orta seviye
- Ders 76/116
- 5 dk
stdarg.h ile değişken argümanlı fonksiyon öğrenirsin.
stdarg.h
C'de bazı fonksiyonlar değişken sayıda argüman alabilir: printf gibi. <stdarg.h> başlığı bu işi kolaylaştıran araçları sunar.
Dört temel parça vardır: va_list (argüman listesi tipi), va_start(liste, son_sabit) (listeyi başlatır), va_arg(liste, tip) (bir sonraki argümanı okur), va_end(liste) (listeyi kapatır). Önemli nokta: fonksiyon kaç argüman alacağını bir şekilde bilmelidir. printf bunu format dizesinden çıkarır; sum_n gibi bir fonksiyon ise ilk argüman olarak sayımı alır. ... imza sonundaki üç nokta, değişken argümanların geldiğini belirtir.
sum_n örneği
Değişken argümanlı bir fonksiyon yazalım: int sum_n(int count, ...). İlk parametre count kaç sayı toplanacağını söyler; ... ise toplanacak sayıları ifade eder.
Tanım: va_list args; va_start(args, count); int total = 0; for (int i = 0; i < count; i++) total += va_arg(args, int); va_end(args); return total;. va_start'ın ikinci parametresi, son sabit (fixed) parametredir; burada count. Bu, derleyiciye argümanların bellekte nereden başladığını söyler. va_arg her çağrıda bir sonraki argümana geçer ve verilen tiple okur. Döngü bitince va_end ile liste kapatılır. Çağrı: sum_n(3, 10, 20, 30) → 60.
Uygulama sum_n fonksiyonu
int sum_n(int count, ...) yaz. İçinde va_list args;, va_start(args, count);, bir for döngüsünde total += va_arg(args, int);, döngü sonunda va_end(args);, return total;. main'de printf("%d\n", sum_n(3, 10, 20, 30)); çağır.
Başlangıç kodu
#include <stdio.h>
#include <stdarg.h>
// sum_n: count adet int'i topla, döndür
// va_list tanımla, va_start ile başlat, va_arg ile oku, va_end ile kapat
// main: sum_n(3, 10, 20, 30) çağır ve yazdır
int main(void) {
// buraya yaz
return 0;
}Örnek çözüm
#include <stdio.h>
#include <stdarg.h>
int sum_n(int count, ...) {
va_list args;
va_start(args, count);
int total = 0;
for (int i = 0; i < count; i++) {
total += va_arg(args, int);
}
va_end(args);
return total;
}
int main(void) {
printf("%d\n", sum_n(3, 10, 20, 30));
return 0;
}Beklenen çıktı
60
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 va_arg ne işe yarar?
- bir sonraki argümanı okur Doğru cevap
- listeyi başlatır
- listeyi kapatır
- argüman sayısını döndürür
Açıklama: va_arg(liste, tip) bir sonraki argümanı okur.
2 stdarg makroları
| Kavram | Anlamı |
|---|---|
va_list |
argüman listesi tipi |
va_start |
listeyi başlat |
va_arg |
sonrakını oku |
va_end |
listeyi kapat |
3 va_start çağrısı
va_start(args, ____);
va_start(args, count);
Açıklama: va_start'ın ikinci parametresi son sabit parametredir.