Ich bin unglücklicherweise nicht in der Lage, VS 2010 für ein Projekt zu verwenden, und habe festgestellt, dass der folgende Code immer noch nicht mit dem nicht standardkonformen Compiler erstellt wird:
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
char buffer[512];
snprintf(buffer, sizeof(buffer), "SomeString");
return 0;
}
(Kompilierung fehlgeschlagen mit dem Fehler: C3861: 'snprintf': Bezeichner nicht gefunden)
Ich erinnere mich, dass dies vor langer Zeit bei VS 2005 der Fall war, und bin schockiert zu sehen, dass es immer noch nicht behoben wurde.
Weiß jemand, ob Microsoft Pläne hat, seine Standard-C-Bibliotheken in das Jahr 2010 zu verschieben?
c
visual-studio-2010
Andrew
quelle
quelle
Antworten:
Kurzgeschichte: Microsoft hat snprintf endlich in Visual Studio 2015 implementiert. In früheren Versionen können Sie es wie folgt simulieren.
Lange Version:
Hier ist das erwartete Verhalten für snprintf:
Releases vor Visual Studio 2015 hatten keine konforme Implementierung. Es gibt stattdessen nicht standardmäßige Erweiterungen wie
_snprintf()
(die beim Überlauf keinen Nullterminator schreiben) und_snprintf_s()
(die die Nullterminierung erzwingen können, beim Überlauf jedoch -1 anstelle der Anzahl der Zeichen zurückgeben, die geschrieben worden wären).Vorgeschlagener Fallback für VS 2005 und höher:
quelle
snprintf
ist nicht Teil von C89. Es ist nur in C99 Standard. Microsoft hat keinen Plan, C99 zu unterstützen .(Aber es ist auch Standard in C ++ 0x ...!)
Weitere Problemumgehungen finden Sie in den folgenden Antworten.
quelle
_snprintf
ist eine unsichere Funktion, die sich anders verhältsnprintf
(sie fügt nicht unbedingt einen Nullterminator hinzu), daher sind die in dieser Antwort gegebenen Ratschläge irreführend und gefährlich.Wenn Sie den Rückgabewert nicht benötigen, können Sie snprintf auch einfach als _snprintf_s definieren
quelle
Ich glaube das Windows-Äquivalent ist
sprintf_s
quelle
sprintf_s
verhält sich anders alssnprintf
.Ein weiterer sicherer Ersatz für
snprintf()
undvsnprintf()
wird von ffmpeg bereitgestellt. Sie können die Quelle hier überprüfen (vorgeschlagen).quelle
Ich habe den Code von @Valentin Milea ausprobiert, aber ich habe Fehler bei der Zugriffsverletzung. Das einzige, was für mich funktioniert hat, war die Implementierung von Insane Coding: http://asprintf.insanecoding.org/
Insbesondere habe ich mit VC ++ 2008 Legacy-Code gearbeitet. Bei der Implementierung von Insane Coding (kann über den obigen Link heruntergeladen werden) habe ich drei Dateien verwendet :
asprintf.c
,asprintf.h
undvasprintf-msvc.c
. Andere Dateien waren für andere Versionen von MSVC.[EDIT] Der Vollständigkeit halber sind ihre Inhalte wie folgt:
asprintf.h:
asprintf.c:
vasprintf-msvc.c:
Verwendung (Teil
test.c
von Insane Coding):quelle