CodeBlanks Logo Icon CodeBlanks

Güvenli fonksiyonlar

gets yerine fgets gibi güvenli alternatifleri öğrenirsin.

Güvenli fonksiyonlar

C standart kütüphanesi güvenli alternatifler sunar: gets yerine fgets, strcpy yerine strncpy. Bu fonksiyonlar açıkça bir boyut parametresi alır.

fgets(buf, size, stdin) en fazla size - 1 bayt okur ve dizeyi sonlandırır. strncpy(dst, src, n) en fazla n bayt kopyalar; ancak kaynak n'den kısaysa hedefi null ile doldurur, uzunsa sonlandırıcıyı yazmaz. Bu yüzden strncpy kullanınca manuel olarak dst[n-1] = '\0' yazmak güvenlidir. snprintf de sprintf'in güvenli versiyonudur; taşmayı önler.

fgets ve strncpy imzaları

fgets'in imzası char *fgets(char *s, int size, FILE *stream) biçimindedir. size parametresi okunacak en fazla bayt sayısını belirler; fonksiyon otomatik null ekler.

strncpy'nin imzası char *strncpy(char *dst, const char *src, size_t n) biçimindedir. n, kopyalanacak en fazla bayt sayısıdır. Kaynak n'den uzunsa hedef null ile sonlanmaz; bu durumda programcı manuel sonlandırmalıdır. sizeof(buf) kullanmak dizi boyutunu güvenle verir. Bu fonksiyonlar derleyici uyarılarıyla da desteklenir; gets çağrısı modern C'de tamamen kaldırılmıştır.

Uygulama strncpy ile güvenli kopyala

<string.h> başlığını ekle. main içinde char dst1[8] ve char dst2[4] tanımla. strncpy(dst1, "hello", 7) ve dst1[7] = '\0'; strncpy(dst2, "world", 3) ve dst2[3] = '\0'. Her birini printf("%s\n", dst1) ve printf("%s\n", dst2) ile yazdır.

Başlangıç kodu

main.c
#include <stdio.h>

// string.h başlığını ekle
// strncpy ile dst1 ve dst2'ye kopyala, null ile sonlandır
// printf ile yazdır

int main(void) {
    return 0;
}

Örnek çözüm

main.c
#include <stdio.h>
#include <string.h>

int main(void) {
    char dst1[8];
    char dst2[4];
    strncpy(dst1, "hello", 7);
    dst1[7] = '\0';
    strncpy(dst2, "world", 3);
    dst2[3] = '\0';
    printf("%s\n", dst1);
    printf("%s\n", dst2);
    return 0;
}

Beklenen çıktı

hello
wor

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Güvenli ve güvensiz fonksiyonları eşle

Kavram Anlamı
gets Tehlikeli okuma
fgets Güvenli okuma
strcpy Tehlikeli kopya
strncpy Güvenli kopya

2 Hangisi güvenli bir dize okuma fonksiyonudur?

  • scanf
  • gets
  • fgets Doğru cevap
  • strcpy

Açıklama: fgets bir boyut parametresi alır ve taşmayı önler.

3 fgets çağrısını tamamla

Soru
fgets(buf, sizeof(buf), ____);
Cevap
fgets(buf, sizeof(buf), stdin);

Açıklama: stdin standart girişi ifade eder.

Uzman bölümündeki tüm dersler