Bu bölümü de Dizgiler dersine ekliyorum:
Alıntı:
>readf yerine readln ve chomp
Konsoldan satır okumak programcılıkta yaygın bir işlem değildir. Yine de deneme programlarında kullanılacağı için girişten satır okuma ile ilgili bazı karışıklıklara burada değinmek istiyorum.
Dizgiler bütün karakterleri barındırabildikleri için satır sonu anlamına gelen '\n' karakterini de okuyabilirler. O yüzden, girdiğimiz bilgilerin sonunda bastığımız Enter tuşu da '\n' değeri ile okunur ve dizginin parçası haline gelir.
Bunun sonucunda da şimdiye kadar gördüklerimiz gibi readf ile yazılmış olan şu program istediğimiz gibi işlemez:
> import std.stdio;
>
> void main()
> {
> char[] isim;
>
> write("İsminiz nedir? ");
> readf(" %s", &isim);
>
> writeln("Çok memnun oldum ", isim, "!");
> }
> ```
>
> Programa verilen isimden sonra basılan Enter girişi sonlandırmaz:
>
> 'İsminiz nedir? Ali
> ← Enter'a basıldığı halde giriş sonlanmaz
> ← (bir kere daha basıldığını varsayalım)'
>
> Dahası, girişten kaç karakter okunmak istendiği de bilinmediği için readf giriş tükenene kadar gelen bütün karakterleri dizginin içine okur.
>
> Konsolda girişi sonlandırmak için Linux ortamlarında Ctrl-D'ye, Windows ortamlarında da Ctrl-Z'ye basılır. Öyle yaptığınızda, Enter'lar nedeniyle oluşan satır sonu karakterlerinin de dizginin parçası haline geldiklerini görürsünüz:
>
> 'Çok memnun oldum Ali
> ← isimden sonra "satır sonu" var
> ! ← (bir tane daha)'
>
> Bu yüzden readf çoğu durumda girişten dizgi okumaya uygun değildir. Onun yerine ismi "satır oku" anlamındaki "read line"dan türemiş olan readln işlevidir.
>
> readln'ın kullanımı readf'ten farklıdır. " %s" düzen dizgisini ve & işlecini gerektirmez:
>
>
> import std.stdio;
void main()
{
char[] isim;
write("İsminiz nedir? ");
readln(isim);
writeln("Çok memnun oldum ", isim, "!");
}
> Buna rağmen satır sonunu belirleyen kodu o da barındırır:
'İsminiz nedir? Ali
Çok memnun oldum Ali
! ← isimden sonra yine "satır sonu" var'
Dizgilerin sonundaki satır sonu kodları std.string modülündeki chomp ile silinebilir:
> import std.stdio;
> import std.string;
>
> void main()
> {
> char[] isim;
>
> write("İsminiz nedir? ");
> readln(isim);
> isim = chomp(isim);
>
> writeln("Çok memnun oldum ", isim, "!");
> }
> ```
>
> Yukarıdaki chomp ifadesi isim'in sonundaki satır sonu kodlarının silinmiş halini döndürür. O halinin tekrar isim'e atanması da isim'i değiştirmiş olur:
>
> 'İsminiz nedir? Ali
> Çok memnun oldum Ali! ← "satır sonu" kodlarından arınmış olarak'
>
> readln ve chomp zincirleme olarak daha kısa da yazılabilir:
>
>
> string isim = chomp(readln());
> O yazımı string türünü tanıttıktan sonra kullanmaya başlayacağım.
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]