Neden strncpy boş sonlandırmak değil mi?
strncpy()
sözde tampon taşmaları önler. Ama eğer null bir sonlandırıcı olmadan taşma varsa engeller, tüm olasılık sonraki dize işlemi taşacak. Bu karşı korumak için kendimi yaparken buluyorum:
strncpy( dest, src, LEN );
dest[LEN - 1] = '\0';
man strncpy
verir:
Bu strncpy() fonksiyonu benzer, daha fazla n daha src bayt kopyalanan hariç. Eğer src ilk n byte arasında boş bayt yok, bu nedenle, sonuç boş sonlandırılmış olacak.
Boş olmadan bir şey görünüşte masum gibi sonlandırıcı:
printf( "FOO: %s\n", dest );
...kaza olabilir.
strncpy()
daha iyi, daha güvenli bir alternatif var mı?
CEVAP
strncpy
güvenli strcpy
, başka bir ortasında bir dize eklemek için kullanılan olması gerekiyordu olarak kullanılmak üzere tasarlanmamıştır.
Tüm bu "güvenli" taşması açıkları azaltmak için daha sonra standartları eklenen düzeltmeleri snprintf
vsnprintf
gibi dize işleme işlevleri vb.
Wikipedia strncpy
kendini güvende yazma alternatif olarak strncat
söz:
*dst = '\0'; strncat(dst, src, LEN);
EDİT
Strncat boş ise uzun ya LEN char var eğer eşit bir dize sonlandırıcı zaman LEN karakterden uzun özledim.
Neyse, demek istediğim kullanarak strncat yerine herhangi bir homegrown çözüm gibi memcpy(..., strlen(...))/ne olursa olsun bu uygulama strncat olabilir hedef/platform optimize edilmiş bir kütüphane.
Elbette dst en azından nullchar tutan kontrol etmeniz gerekir, strncat doğru kullanmak gibi bir şey olur yani:
if(LEN) { *dst = '\0'; strncat(dst, src, LEN-1); }
Ben de strncpy eğer src n char, hedef dize kesilecek daha kısa olması durumunda, başka bir dizeye bir dize kopyalamak için pek kullanışlı değil, o admitt.
Neden Ortamı yok.() Çıkış programı art...
Neden't GCC*****a (**)*(**) optim...
Neden' ◎ܫ◎ ve fonksiyonu t JavaSc...
Neden boyutu(x ) x artım değil mi?...
Neden Java statik olarak bir sınıf bil...