Belirsizlik C Standardının kendisinden başlar. Hem C99 hem de C11 aynı snprintfişlev açıklamasına sahiptir . İşte C99'daki açıklama:
7.19.6.5 snprintfİşlev
Özet
1 #include <stdio.h>
int snprintf(char * restrict s, size_t n, const char * restrict format, ...);
Açıklama
2 snprintfİşlev, fprintfçıktının sbir akış yerine bir diziye (bağımsız değişken tarafından belirtilen ) yazılması dışında işlevine eşdeğerdir . Eğer nis sıfır, hiçbir şey yazılır ve sbir boş gösterici olabilir. Aksi takdirde, n-1dizinin ötesindeki çıktı karakterleri diziye yazılmak yerine atılır ve diziye gerçekte yazılan karakterlerin sonuna bir boş karakter yazılır. Kopyalama çakışan nesneler arasında gerçekleşirse, davranış tanımsızdır.
3
döndürür İşlev, önceden yazılmış olması gereken karakter sayısını döndürür.
snprintfnyeterince büyük, sonlandırıcı boş karakter sayılmıyor veya bir kodlama hatası oluştuysa negatif bir değer. Böylece, boş sonlandırılmış çıktı, ancak ve ancak döndürülen değer negatif değilse ve değerinden küçükse tamamen yazılmıştır n.
Bir yandan cümle
Aksi takdirde, ötesinde çıkış karakterleri n-1st atılır diziye yazılırken ziyade, bir null karakteri aslında yazılı karakterlere sonunda yazılır diziye
diyor
(eğer s3 karakter uzunluğunda diziye noktaları ve) n3, daha sonra 2 karakter yazılır ve 2 tek ötesinde karakterler atılır ; daha sonra bu 2'den sonra boş karakter yazılır (ve boş karakter 3. karakter yazılır) .
Ve bunun asıl soruyu yanıtladığını düşünüyorum.
CEVAP:
Kopyalama çakışan nesneler arasında gerçekleşirse, davranış tanımsızdır.
Eğer n0 sonra hiçbir şey çıktıya yazılır olan
hiçbir kodlama hataları karşılaştı, aksi takdirde, çıkışı DAİMA boş sonlandırılmış ( ne olursa olsun ister çıkış dizi veya değil çıktı uyuyor ; bazı karakterler çıktı böyle atılır eğer yapmazsan dizi asla aşılmaz),
aksi takdirde (kodlama hatalarıyla karşılaşılırsa) çıktı boş sonlandırılmamış kalabilir .
Öte yandan
son cümle
Bu nedenle, boş sonlandırılmış çıktı, yalnızca ve ancak döndürülen değer negatif değilse ve şundan küçükse tamamen yazılmıştır. n
belirsizlik veriyor (veya İngilizcem yeterince iyi değil). En az iki yolla cümle yorumlayabilir:
1. çıkış boş sonlandırılmış ve eğer geri değeri negatif olmayan ve yalnızca daha azn geri değer olması durumunda olan aracı ( değil az n, örneğin, çıkış (dahil null karakterini sonlandırmak) diziye sığmazsa, çıktı boş olarak sonlandırılmaz ).
2. Çıktı tamamlanır (hiçbir karakter atılmamıştır) ancak ve ancak döndürülen değer negatif değilse ve değerinden küçüksen .
Yukarıdaki yorumun 1 CEVAPLA çeliştiğine, yanlış anlaşılmalara ve uzun tartışmalara neden olduğuna inanıyorum. Bu nedenle, snprintfherhangi bir belirsizliği ortadan kaldırmak için işlevi tanımlayan son cümlenin bir değişikliğe ihtiyacı vardır (bu, C dili Standardına bir Teklif yazmak için zemin sağlar).
İnanıyorum ki belirsiz olmayan ifade örneği http://en.cppreference.com/w/c/io/fprintf (bkz. 4)) Adresinden, bağlantı için @ "Martin Ba" sayesinde alınabilir .
Ayrıca " snprintf: Bu işlevin açıklamasını değiştirmek için herhangi bir C Standart Önerisi / planı var mı? " Sorusuna da bakın .