Güvenli fonksiyonlar
- C kursu
- Uzman
- Ders 23/47
- 5 dk
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
#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
#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
fgets(buf, sizeof(buf), ____);
fgets(buf, sizeof(buf), stdin);
Açıklama: stdin standart girişi ifade eder.