Мне очень жаль, что я застрял в использовании VS 2010 для проекта и заметил, что следующий код все еще не создается с использованием компилятора, не соответствующего стандартам:
#include <stdio.h>
#include <stdlib.h>
int main (void)
{
char buffer[512];
snprintf(buffer, sizeof(buffer), "SomeString");
return 0;
}
(не выполняется компиляция с ошибкой: C3861: 'snprintf': идентификатор не найден)
Я помню, как это было еще в VS 2005, и я потрясен, увидев, что это до сих пор не исправлено.
Кто-нибудь знает, планирует ли Microsoft перенести свои стандартные библиотеки C в 2010 году?
c
visual-studio-2010
Андрей
источник
источник
Ответы:
Краткая история: Microsoft наконец-то реализовала snprintf в Visual Studio 2015. В более ранних версиях вы можете смоделировать его, как показано ниже.
Длинная версия:
Вот ожидаемое поведение snprintf:
В выпусках до Visual Studio 2015 не было соответствующей реализации. Вместо этого существуют нестандартные расширения, такие как
_snprintf()
(который не записывает символ конца строки при переполнении) и_snprintf_s()
(который может обеспечивать завершение нуля, но возвращает -1 при переполнении вместо количества символов, которые были бы записаны).Предлагаемый запасной вариант для VS 2005 и новее:
источник
snprintf
не является частью C89. Стандартно только в C99. У Microsoft нет планов поддержки C99 .(Но это также стандарт в C ++ 0x ...!)
См. Другие ответы ниже для обходного пути.
источник
_snprintf
является небезопасной функцией, которая ведет себя иначеsnprintf
(она не обязательно добавляет нулевой терминатор), поэтому совет, данный в этом ответе, вводит в заблуждение и опасен.Если вам не нужно возвращаемое значение, вы также можете просто определить snprintf как _snprintf_s
источник
Я считаю, что эквивалент Windows
sprintf_s
источник
sprintf_s
ведет себя иначе, чемsnprintf
.Еще одна безопасная замена
snprintf()
иvsnprintf()
предоставляется ffmpeg. Вы можете проверить источник здесь (рекомендуется).источник
Я пробовал код @Valentin Milea, но у меня есть ошибки нарушения доступа. Единственное, что у меня сработало, - это реализация Insane Coding: http://asprintf.insanecoding.org/
В частности, я работал с устаревшим кодом VC ++ 2008. От реализации безумной Coding ( в можно скачать по ссылке выше), я использовал три файла:
asprintf.c
,asprintf.h
иvasprintf-msvc.c
. Остальные файлы были для других версий MSVC.[РЕДАКТИРОВАТЬ] Для полноты их содержание следующее:
asprintf.h:
asprintf.c:
vasprintf-msvc.c:
Использование (часть
test.c
предоставлена Insane Coding):источник