Dizgeler için Girdi Dönüşümleri
Önceki Biçimli Girdi Sonraki
Dizgeler için Girdi Dönüşümleri
Bu bölümde dizge ve karakterlerin okunması için %s, %S, %[, %c ve %C girdi dönüşüm belirteçleri açıklanmıştır.
Bu dönüşümlerden girdilerin alınması için iki seçeneğiniz vardır:
  • Onu saklamak için bir tampon sağlayın. Bu öntanımlıdır. Bu tampona char * veya wchar_t * türünde bir argüman sağlayın (ikincisi için l değiştiricisi olmalı).
    Uyarı
    Sağlam bir yazılım için girdi (sonlandırıcı boş karakter dahil), sağladığınız tamponun boyunu aşmamalıdır. Genelde, bunu yapmanın tek yolu, en büyük alan genişliğini tampon boyunun bir eksiği olarak vermektir. Bir tampon oluşturuyorsanız taşmalardan kaçınmak için uzunluğunu daima en büyük alan genişliğine eşit uzunlukta seçmelisiniz.
  • Ne kadar büyüklükte bir tampon gerektiğini a im karakterini belirterek scanf işlevine sorun. Bu bir GNU oluşumudur. Tampon adresi için char ** türünde bir argüman belirtmelisiniz. Bkz. Dizge Dönüşümlerinde Özdevimli Ayırma.
%c dönüşümü en basitidir: Daima sabit sayıda karakterle eşleşir. En büyük alan genişliği kaç karakter okunacağını söyler; en büyük alan genişliğini belirtmezseniz öntanımlı olarak 1 değeri kullanılır. Bu dönüşüm okuduğu metnin sonuna bir sonlandırıcı boş karakter eklemez. Ayrıca metnin içindeki boşluk karakterlerini atlar. Özellikle sonraki n karakteri okur, bu kadar karakter bulamazsa başarısız olur. %c dönüşümü daima sabit uzunlukta okuma yaptığından taşmadan kaçınmak için tamponu yeterli uzunlukta yapmalısınız.
%lc veya %C dönüşümleri akımın, harici bayt akımından açıldığı sırada saptanan dönüşüm kullanılarak çevrilen geniş karakterlerin saklanmasını sağlar. Ortamdan okunan baytların sayısı MB_CUR_LEN * n ile sınırlıdır ve çıktı dizgesinde saklanan en çok n geniş karakter alınır.
%s dönüşümü boşluk karakterleri olmayan karakterlerden oluşan bir dizge ile eşleşir. Dahili boşlukları atlar ve iptal eder, fakat biraz okuma yaptıktan sonra çok fazla boşluk karakterine rastlarsa durur. Okuduğu metnin sonuna bir boş karakter ekler.
Örneğin, okunacak girdi,
 hello, world
ise, %10c dönüşümü " hello, wo" üretir. Aynı girdi için %10s dönüşümü kullanılırsa, "hello," üretilir.
Uyarı
%s için bir alan genişliği belirtirseniz, okunan karakter sayısı boşluk karakterine rastlanan yer ile sınırlıdır. Bu hemen hemen kaçınılmaz olarak geçersiz bir girdinin yazılımınızın çökmesine sebep olacağı anlamına gelir ki bu bir yazılım hatasıdır.
%ls ve %S dönüşümleri %s gibi kotarılır, bir farkla, dış bayt dizisi, kendi karakter kodlaması ile geniş karakterlere akım ile ilişkili dönüşüm kullanılarak çevrilir. Belirteç ile birlikte genişlik belirtilirse, bunlar geniş karakterleri öçtüğünden, akımdan kaç bayt okunacağı doğrudan doğruya saptanmaz. Fakat bir üst sınır, genişlik değeri ile MB_CUR_MAX çarpılarak hesaplanabilir.
Belli kriterlere göre sizin seçiminize bağlı olarak karakterlerin okunmasını sağlamak isterseniz %[ dönüşümünü kullanın. [ ve ] ayraçlarının arasını düzenli ifadelerdeki sözdizimini kullanarak yazabilirsiniz. Özel durumlar olarak:
  • ] karakteri ifadenin ilk karakteri olarak belirtilebilir.
  • Bir gömülü - karakteri (ifadenin ilk veya son karakteri olamaz) bir karakter aralığını belirtmek için kullanılabilir.
  • Bir ^ karakteri [ ayracından sonra kullanılırsa, girdi karakterleri burada listelenen karakterlerin dışındakilerdir.
%[ dönüşümü dahili boşluk karakterlerini atlamaz.
Aşağıda bazı %[ dönüşüm örnekleri ve anlamları vardır:
%25[1234567890]
25 haneye kadar bir sayı ile eşleşir.
%25[][]
25 köşeli ayraca kadar bir dizge ile eşleşir.
%25[^ \f\n\r\t\v]
Hiçbir boşluk karakteri içermeyen 25 karaktere kadar bir dizge ile eşleşir. Bu %s’den tamamen farklıdır, çünkü girdi, boşluk karakterlerinden biri ile başlarsa bu %[ dönüşümü bir eşleşme hatası bildirir ama %s dönüşümü onu basitçe iptal eder.
%25[a-z]
25 karaktere kadar küçük harflerle eşleşir.
%c ve %s gibi %[ belirteci de l tür değiştiricisi varsa geniş karakterleri üretebilir. Yukarıda bu konu ile ilgili bahsedilen herşey %l[ için de geçerlidir.
Bir hatırlatma daha
Bir en büyük genişlik belirtmezseniz ya da a imini kullanmazsanız %s ve %[ belirteçleri tehlikelidir, çünkü girdi çok uzun olursa tampon taşar. Tamponun ne kadar uzunlukta olduğunun önemi yoktur, bir kullanıcı onu da taşıracak bir girdi yapabilir. İyi geliştirilmiş bir yazılım geçersiz bir girdiyi kapsamlı bir hata iletisi ile bildirir, çökerek değil.
Önceki Üst Ana Başlık Sonraki
Sayısal Girdi Dönüşümleri Başlangıç Dizge Dönüşümlerinde Özdevimli Ayırma
Bir Linux Kitaplığı Sayfası