_Onk@_, mesajından alıntı:
Not: Standart C kütüphanesi gerçekten titiz çalışmalar sonucunda oluşturulmuştur. scanf'nin yanında (eşdeğer değiller dikkat ediniz) gets'in de sunulmasının mantıklı bir sebebi olduğu açıktır.
Ne kadar titiz olursa olsun insanlar hata yaparlar. gets'in de tasarlandığı zaman mantıklı bir sebebi olduğundan eminim. Ama günümüzde kendi belgelerinde bile "bunu kullanmayın" denecek kadar güvensiz bir işlevdir.
Tabii scanf de gets kadar güvensiz olarak kullanılabilir:
Kod:
scanf("%s", s); // hata!
s'te ne kadar yer olursa olsun, taşma olasılığı vardır.
Scanf boşluk karakterinden sonraki karakterleri de alıyor mu? Önce bunun cevabını vermek gerekli.
"Normalde" almaz. Ama %c ile alır:
Kod:
#include <stdio.h>
int main()
{
char karakterler[100] = { 0 };
int adet = 0;
printf("Icinde bosluklar olabilen satir? ");
/*
* Bu duzen dizgisinin derleme zamaninda olusturulmasi mumkundur; icine
* acikca 100 yazmak ayip ve hataya acik ama "giristen bosluklar
* okuyabilme" ornegi ile ilgisiz...
*/
scanf("%100c%n", karakterler, &adet);
karakterler[adet - 1] = '\0';
printf("%d karakter okudum: %s\n", adet, karakterler);
}
fflush(stdin);//Ali Hocam kızacak ama

Düzgün çözüm yolunu unuttum, önerilmeyen çözüm.
fflush'ın belgelerinde açıkça "çıkış akımları" ile ilgili olduğu yazar. 
Günümüzde genelde:
stdin=tuş takımı;
stdout=ekran, daha açık bir ifadeyle konsol ekranı;
stderr=hataların yakalandığı akış diyebiliriz.
Doğru ama günümüzde, günlük olarak, hatta her gün,
standart çıkışı başka programalara da yönlendiriyoruz:
grep birsey * | more
Orada 'grep' programının standart çıkışı 'more' programının standart girişine bağlanır. Günde herhalde en az on kere kullanırım.
Ali
Bookmarks