Saya cukup malang untuk terjebak menggunakan VS 2010 untuk sebuah proyek, dan memperhatikan kode berikut masih tidak dibangun menggunakan kompiler yang tidak memenuhi standar yang sesuai:
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
char buffer[512];
snprintf(buffer, sizeof(buffer), "SomeString");
return 0;
}
(gagal kompilasi dengan kesalahan: C3861: 'snprintf': pengenal tidak ditemukan)
Saya ingat kasus ini terjadi pada VS 2005 dan saya terkejut melihat itu masih belum diperbaiki.
Apakah ada yang tahu jika Microsoft memiliki rencana untuk memindahkan perpustakaan C standar mereka ke tahun 2010?
c
visual-studio-2010
Andrew
sumber
sumber
Jawaban:
Singkat cerita: Microsoft akhirnya mengimplementasikan snprintf di Visual Studio 2015. Pada versi sebelumnya Anda dapat mensimulasikannya seperti di bawah ini.
Versi panjang:
Berikut adalah perilaku yang diharapkan untuk snprintf:
Rilis sebelum Visual Studio 2015 tidak memiliki implementasi yang sesuai. Ada ekstensi non-standar seperti
_snprintf()
(yang tidak menulis null-terminator pada overflow) dan_snprintf_s()
(yang dapat memberlakukan penghentian null, tetapi mengembalikan -1 pada overflow, bukan jumlah karakter yang akan ditulis).Pengganti yang disarankan untuk VS 2005 dan yang lebih baru:
sumber
snprintf
bukan bagian dari C89. Ini standar hanya di C99. Microsoft tidak memiliki rencana yang mendukung C99 .(Tapi itu juga standar di C ++ 0x ...!)
Lihat jawaban lain di bawah untuk mengatasinya.
sumber
_snprintf
adalah fungsi tidak aman yang berperilaku berbeda darisnprintf
(tidak perlu menambahkan terminator nol), jadi saran yang diberikan dalam jawaban ini menyesatkan dan berbahaya.Jika Anda tidak membutuhkan nilai kembalian, Anda juga bisa mendefinisikan snprintf sebagai _snprintf_s
sumber
Saya percaya setara dengan Windows
sprintf_s
sumber
sprintf_s
berperilaku berbeda darisnprintf
.Pengganti aman lainnya
snprintf()
danvsnprintf()
disediakan oleh ffmpeg. Anda dapat melihat sumbernya di sini (disarankan).sumber
Saya mencoba kode @Valentin Milea tetapi saya mendapat kesalahan pelanggaran akses. Satu-satunya hal yang berhasil bagi saya adalah penerapan Insane Coding: http://asprintf.insanecoding.org/
Secara khusus, saya bekerja dengan kode warisan VC ++ 2008. Dari pelaksanaan Insane Coding ini (dapat didownload dari link di atas), saya menggunakan tiga file:
asprintf.c
,asprintf.h
danvasprintf-msvc.c
. File lain adalah untuk versi MSVC lainnya.[EDIT] Lengkapnya isinya sbb:
asprintf.h:
asprintf.c:
vasprintf-msvc.c:
Penggunaan (bagian dari
test.c
disediakan oleh Insane Coding):sumber