🧠 C Programlamada fgets() ve gets() Fonksiyonları
Bu rehberde, C programlama dilinde boşluk içeren metinleri (string) doğru şekilde almayı öğreneceksiniz.
scanf() fonksiyonunun kısıtlamalarını, gets() fonksiyonunun neden artık önerilmediğini
ve modern C programlamada güvenli seçenek olan fgets() fonksiyonunun nasıl kullanıldığını göreceksiniz.
🎯 Bu Rehberde Ne Öğreneceksiniz
scanf()ile boşluklu metin okuma problemini anlamakgets()fonksiyonunun sözdizimini ve risklerini öğrenmekfgets()ile güvenli veri almayı uygulamak- Dosyadan ve standart girdiden (
stdin) okuma örnekleri gets()vsfgets()güvenlik karşılaştırması
1️⃣ scanf() Fonksiyonunun Sınırlamaları
C’de scanf() genellikle basit girdiler için kullanılır, ancak boşluk içeren string okumada başarısız olur.
Boşluk veya yeni satır (\n) gördüğünde okumayı durdurur.
#include<stdio.h>
int main() {
char string[10];
printf("Metni girin: ");
scanf("%s", string); // Boşluktan sonrasını okumaz
printf("\nOkunan metin: %s", string);
return 0;
}
📤 Çıktı:
Metni girin: Merhaba Dünya
Okunan metin: Merhaba
💡 Gördüğünüz gibi, scanf() yalnızca ilk kelimeyi okur. Boşlukları da dahil etmek için gets() veya fgets() kullanılır.
2️⃣ gets() Fonksiyonu
gets() fonksiyonu, kullanıcıdan bir satır metin okumak için kullanılır. Yeni satır (\n) karakterine ulaşana kadar okumayı sürdürür.
Sözdizimi:
gets(degisken_adi);
Örnek:
#include<stdio.h>
int main() {
char string[10];
printf("Metni girin: ");
gets(string); // Tüm satırı okur
printf("\nOkunan metin: %s", string);
return 0;
}
📤 Örnek çıktı:
Metni girin: Merhaba Dünya
Okunan metin: Merhaba Dünya
⚠️ Uyarı: gets() artık modern C standardında kaldırılmıştır. Kullanıcının belirttiği tampon (buffer) boyutunu aşması durumunda bellek taşması (buffer overflow) oluşur. Bu, programın çökmesine veya güvenlik açığına yol açabilir.
3️⃣ fgets() Fonksiyonu (Güvenli Yöntem)
fgets() fonksiyonu, gets()'in güvenli alternatifidir. Hem dosyadan hem de klavyeden veri okumak için kullanılabilir. Veri uzunluğu belirtilir, böylece bellek taşması engellenir.
Sözdizimi:
fgets(char *str, int n, FILE *stream);
| Parametre | Açıklama |
|---|---|
| str | Verinin kaydedileceği karakter dizisi |
| n | Okunacak maksimum karakter sayısı (n-1 kadar okunur, sonuna \0 eklenir) |
| stream | Veri kaynağı (örneğin stdin veya fp) |
🖥️ A. Standart Girdiden (stdin) Okuma
#include<stdio.h>
int main() {
char string[20];
printf("Metni girin: ");
fgets(string, 20, stdin); // Maksimum 19 karakter + '\0'
printf("\nOkunan metin: %s", string);
return 0;
}
📤 Örnek çıktı:
Metni girin: Merhaba Dünya
Okunan metin: Merhaba Dünya
📂 B. Dosyadan Okuma
#include<stdio.h>
int main() {
char string[20];
FILE *fp = fopen("veri.txt", "r"); // Dosyayı okuma modunda aç
fgets(string, 20, fp); // İlk 19 karakteri oku
printf("Dosyadan okunan: %s", string);
fclose(fp);
return 0;
}
💡 Eğer veri.txt dosyasında Rabisu Cloud fgets örneği! yazıyorsa, çıktı şu şekilde olur:
Dosyadan okunan: Rabisu Cloud fgets örneği!
⚖️ gets() ve fgets() Karşılaştırması
| Özellik | gets() | fgets() |
|---|---|---|
| Boşluk Okuma | Evet | Evet |
| Tampon Boyutu Sınırı | Hayır | Evet (n parametresiyle) |
| Güvenlik | Düşük (bellek taşması riski) | Yüksek |
| Kaynak Akışı | Yalnızca stdin | stdin veya dosya |
| Durumu | C11'de kaldırıldı | Aktif |
| Tavsiye | ❌ Kullanmayın | ✅ Şiddetle önerilir |
❓ Sıkça Sorulan Sorular (SSS)
1️⃣ scanf() neden boşluklu metinleri okuyamaz?
Çünkü scanf() boşluk veya tab karakterine geldiğinde okumayı durdurur.
2️⃣ gets() neden kaldırıldı?
Kullanıcının girdi uzunluğu kontrol edilmediği için bellek taşması riski oluşturur.
3️⃣ fgets() girdiye \n karakteri ekliyor, nasıl temizlerim?
Şu satırı kullanarak silebilirsin:
string[strcspn(string, "\n")] = '\0';
4️⃣ fgets() ile dosya dışında da kullanılabilir mi?
Evet, hem stdin (klavye) hem de FILE * (dosya) kaynaklarından veri okuyabilir.
5️⃣ Hangisini kullanmalıyım?
Her zaman fgets() kullan. Güvenlidir, standarttır, modern C’nin önerdiği çözümdür.
🚀 Sonuç
C programlamada boşluklu metin girdilerini almak için scanf() yerine fgets() kullanmak en doğru yaklaşımdır. gets() geçmişte pratik olsa da, güvenlik açıkları nedeniyle terk edilmiştir. fgets() sayesinde hem tampon boyutunu belirleyebilir hem de bellek taşması riskini sıfırlayabilirsin.
💡 Kendi C projelerini Rabisu Bulut sanal sunucularında test ederek, gerçek zamanlı performans ölçümleri yapabilir ve güvenli uygulama geliştirme ortamı oluşturabilirsin.
Rabisu Bulut platformunda hemen deneyebilirsiniz.