2012-01-18 30 views
8

Ben şimdiki dir yoluna \ init.scm eklemek için sprintf(newpath, "%s%s", cCurrentPath, "\\init.scm"); kullanıyorum ama her zamanki uyarı vardır: Sprintf_s sprintf analogu nedir (newpath, "% s% s", ...)?

Sprintf_s

warning C4996: 'sprintf': This function or variable may be unsafe. Consider using sprintf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.

böyle "% s% s" dizesini desteklemiyor toplamı. sprintf_s'u kullanarak nasıl yapabilirim?

+0

"Sprintf_s böyle"% s% s "dizgi toplamını desteklemiyor"? Emin misiniz? (BTW, genellikle "toplam" değil, dizeler hakkında konuştuğunuzda birleştirme olarak adlandırılır.) – Mat

+0

evet, C4024 uyarısını gösterir: 'sprintf_s': resmi ve gerçek parametre 2 \t için farklı türler ve – Cynede

+0

kodunuzda bir hata Bu, kodunuzda bir hata . – Mat

cevap

14

sprintf_s temelde sprintf aynıdır, ancak başka bir parametre alır:

sprintf_s(newpath, sizeof(newpath), "%s%s", cCurrentPath, "\\init.scm"); 

Not - newpath normal karakter dizisi, sizeof(newpath) eser ise. Bir gösterici veya argüman olarak iletilen bir dizi ise, boyutu almak için farklı bir yol gerekebilir.
snprintf'u aynı amaçla MS dışı bir ortamda da kullanabilirsiniz (farklı şekilde çalışıyor olsa da).

+0

Ancak% s% s, yeni yollara giden 2 dizenin toplamıdır. Nasıl yapılır? – Cynede

+0

_s işlevleri güvenlik için oluşturulmuştur, bu nedenle ayrılan belleğin üzerine yazmayı denemezsiniz. Bu sebepten ötürü, ikinci paramın, 1. param için tahsis edilmiş belleğin büyüklüğü olması gerekir. Aşağıdaki parametrelerle hiçbir ilgisi yoktur, eğer gerçek metin beklenenden daha uzunsa bellek erişim ihlali olmayacaktır. –

+0

Üzgünüz, ancak biçim dizesini atladım. Şimdi tamir ettim, tıpkı yazdığım gibi kullanıyorsun. – ugoren