CodeBlanks Logo Icon CodeBlanks

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

main.c
#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

main.c
#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ı

Soru
va_start(args, ____);
Cevap
va_start(args, count);

Açıklama: va_start'ın ikinci parametresi son sabit parametredir.

Orta seviye bölümündeki tüm dersler