June 08, 2020

Merhabalar. bugünkü dersim giriş ve çıkış düzenleri.. şimdi aşağıdaki kod ile;

module d2;
import std.stdio;

void main() {

char[4] karakter;
   foreach(say;0..4){
       readf(" %s\n", &karakter[say]);
   }

   foreach(say;0..4){
       writefln("Sayı:%s", karakter[say]);
   }
}

' readf(" %s\n", 'Bunu ben şöyle anlıyorum; '%s' den önce boşluk var demekki karakterden önce yazılacak tüm boşlukları görmezden gel ve bu girişi tıkamasın.. '\n' girilecek karakterden sonra eğer enter a basılırsa bunu görmezden gel böylece giriş tıkanmasın.. Buraya kadar eğer doğru yorum yaptıysam sıkıntı yok.. nitekim programı derlediğimde karakter girişinden önce ne kadar boşluk yazarsam yazayım program tıkanmıyor;

'c@C:~/programlama$ ./d2
y
t
r
p
Sayı:y
Sayı:t
Sayı:r
Sayı:p
'

ama elbette eğer karakter girişinden sonra boşluk tuşuna basıp entera basarsak bunu' %s' den sonra boşkuk bırakmadığımız için Programımız boşluğu da okumaya çalışacak ve giriş tıkanacaktır... .her neyse şimdi kodumu değiştirip tekrar yazıyorum.

module d2;
import std.stdio;

void main() {

char[4] karakter;
   foreach(say;0..4){
       readf(" %s \n", &karakter[say]);
   }

   foreach(say;0..4){
       writefln("Sayı:%s", karakter[say]);
   }
}

'readf(" %s \n", &karakter[say]);' Bu sefer '%s' den sonra veya '\n' den önce bir boşluk koydum. Şimdi kendimce yine yorumluyorum.. '%s' den önce boşluk var demekki karakterden önce yazılacak tüm boşlukları görmezden gel ve bu girişi tıkamasın.. ' %s ' den sonra da boşluk var! demekki karakter girişinden sora eğer boşluklar basılırsa sevgili program sen bunuda görmezden gel ve giirişi tıkama.. Son olarak ta '\n' girilecek karakterden sonra eğer enter a basılırsa bunu da görmezden gel böylece giriş tıkanmasın.. Şimdi eğer mantığım yanıltmıyorsa karakterden önce ve sonra ne kadar boşluk yazıp sonra enter tuşuna bassamda programın giriş tıkanmadan sadece ordaki karakterleri okuması gerekiyordu.. ama olmadı olamadı.. güzel kız yakışıklı yavuklusuna kavuşamadı :-D

c@C:~/programlama$ ./d2
   t
       r
std.format.FormatException@/usr/include/dmd/phobos/std/format.d(668): Trailing characters in formattedRead format string
----------------
??:? pure @safe void std.exception.bailOut!(std.format.FormatException).bailOut(immutable(char)[], ulong, scope const(char)[]) [0x5647eeafb82e]
??:? pure @safe bool std.exception.enforce!(std.format.FormatException).enforce!(bool).enforce(bool, lazy const(char)[], immutable(char)[], ulong) [0x5647eeafb7a8]
........
........

Acep hangi mantık hatasını yapıyorum?

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 08, 2020

Dediğin gibi, tek boşluk karakteri bütün boşluk karakterlerini gözardı eder. Buna satır başı karakteri, tab, vs. de dahildir. O yüzden " %s" yazman yeterli. Hata mesajından anladığımıza göre de son düzen bildiriminden sonra boşluk vs. koyamıyoruz. Koymayalım o zaman... :)

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]