Belirsizlik C Standardının kendisinden başlar. Hem C99 hem de C11 aynı snprintf
iş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 s
bir akış yerine bir diziye (bağımsız değişken tarafından belirtilen ) yazılması dışında işlevine eşdeğerdir . Eğer n
is sıfır, hiçbir şey yazılır ve s
bir boş gösterici olabilir. Aksi takdirde, n-1
dizinin ö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.
snprintf
n
yeterince 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-1
st atılır diziye yazılırken ziyade, bir null karakteri aslında yazılı karakterlere sonunda yazılır diziye
diyor
(eğer s
3 karakter uzunluğunda diziye noktaları ve) n
3, 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 n
0 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, snprintf
herhangi 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 .