SORU
25 ŞUBAT 2015, ÇARŞAMBA


C standart tamponlar null onların terminator geçmiş dokundu değildir garanti ediyor mu?

Bir tampon standart kütüphanenin birçok dize işlevleri için sağlanan çeşitli durumlarda, arabellek null sonlandırıcı ötesinde bir değişiklik olmayacağı garantisi var mı? Örneğin:

char buffer[17] = "abcdefghijklmnop";
sscanf("123", "s", buffer);

buffer "123\0efghijklmnop" eşit gerekli midir?

Başka bir örnek:

char buffer[10];
fgets(buffer, 10, fp);

Eğer okumak satırda sadece 3 karakter uzunluğunda, bir 6 karakter fgets çağrıldı, daha önce olduğu gibi aynı olduğundan emin olabilir?

CEVAP
25 ŞUBAT 2015, ÇARŞAMBA


C99 draft standart değil açıkça devlet ne gerçekleşmeli bu gibi durumlarda, ama tarafından dikkate alınarak birden fazla varyasyon, sen-ebilmek göstermek gerekir işi belirli bir şekilde, böylece karşılayan belirtimi her zaman.

Standart diyor ki:

%s - -beyaz-olmayan boşluk karakter dizisi ile Eşleşir.252)

Eğer l uzunluk değiştirici varsa, karşılık gelen bağımsız bir olacaktır karakter bir dizi kabul etmek için yeterince büyük olan ilk öğe için bir işaretçi sıralı ve otomatik olarak eklenecek bir sonlandırıcı boş karakter.

İşte standart karşılamak için önerdiğiniz yol çalışması gerektiğini gösteren örnekler bir çift.

Örnek:

char buffer[4] = "abcd";
char buffer2[10];  // Note the this could be placed at what would be buffer 4
sscanf("123 4", "%s %s", buffer, buffer2);
// Result is buffer =  "123\0"
//           buffer2 = "4\0"

Örnek B:

char buffer[17] = "abcdefghijklmnop";
char* buffer2 = &buffer[4];
sscanf("123 4", "%s %s", buffer, buffer2);
// Result is buffer = "123\04\0"

Sscanf arayüzü bu farklı olduğunu bilmek için yeterli bilgi sağlamaz unutmayın. Spec bu bit göre her iki durumda da çalışmak zorunda çünkü yani, Örneğin, eğer B düzgün çalışması için, karışıklık olmamalıdır null karakteri sonra bayt ile Örnek A. Bu.

Bu yüzdenörtülü olarakspec nedeniyle belirtildiği gibi çalışması gerekir.

Benzer iddialar diğer işlevler için yerleştirilmiş olabilir, ama bu örnekteki fikir görebilirsiniz sanırım.

NOT: Biçimde boyut sınırları sağlanması, "gibi", . s ^em>olabilirdavranış değişikliği. Belirtimi tarafından, işlevsel sscanf için tampona veri yazmadan önce kendi sınırları için bir tampon sıfır olarak kabul edilebilir. Uygulamada, çoğu uygulamaları geri kalanında rahat bıraktıkları anlamına gelen performans, tercih.

Belirtimi amacı sıfırlama dışında bu işi yapabilecek olduğunda, genellikle açıkça belirtilir. strncpy bir örnektir. Eğer dize uzunluğu en fazla arabellek uzunluğu belirtilenden daha az ise, boş karakter ile geri kalan alanı doldurur. Aslında bu aynı "dize" işlevi olmayan sonlandırılmış bir dize de dönebilir bu insanlar kendi sürümü roll için en yaygın işlevlerinden biri yapar.

Bildiğim kadarıyla fgets gibi, benzer bir durum ortaya çıkabilir. Tek yakaladım belirtimi eğer bir şey okumak ise, tampon kalır açıkça. Kabul edilebilir işlevsel bir uygulama tampon sıfırlama önce okumak için en az bir bayt olup olmadığını görmek için kontrol ederek bu kaçınmak olabilir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • AutoHotkey Tutorials

    AutoHotkey T

    29 Mayıs 2010
  • filmurfreakur

    filmurfreaku

    29 Mart 2007
  • Stevie

    Stevie

    2 Mayıs 2010