Моя программа работает на нескольких платформах. Среди них Windows CE. В настоящее время sprintf широко используется, что приводит к множеству проблем с переполнением буфера и т.д. Вместо этого я хочу заменить их вызовами snprintf. Для Visual Studio я нашел этот вопрос, который решает часть проблемы с win32:

snprintf и Visual Studio 2010

Но я не могу заставить его работать в Windows CE, поскольку функции _vsnprintf_s и _vscprintf, а также константа _TUNCATE недоступны. Кто-нибудь знает, как воспроизвести поведение snprintf (linux) в Windows CE?

5
pjaall 2 Окт 2014 в 13:29

3 ответа

Лучший ответ

Пока что я остановился на следующей функции:

int my_snprintf(char* str, size_t size, const char* format, ...)
{
    int len = 0;
    va_list ap;

    if (size == 0)
    {
        return 0;
    }

    va_start(ap, format);
    len = _vsnprintf(str, size, format, ap);
    va_end(ap);

    if (len < 0 || len >= size)
    {
        len = size - 1;
    }

    if (size > 0)
    {
        str[size - 1] = '\0';
    }

    return len;
}

Предварительное тестирование выглядит нормально, и оно даже компилируется для WinCE .. Любые отзывы приветствуются.

1
pjaall 5 Ноя 2014 в 14:45

Я думаю, что вы могли бы использовать специальную функцию Microsoft printf_s. Я не уверен, что он на 100% совместим, и я думаю, что он не позволяет буферу быть нулевым, когда размер равен 0, но этого может быть достаточно для ваших требований и ... У меня нет VS2010 для подтверждения printf_s присутствует в редакции Windows CE.

0
Serge Ballesta 2 Окт 2014 в 10:24

Это _snprintf под Windows CE:

http://msdn.microsoft.com/en-us/library/ms861145.aspx

Но его поведение немного отличается от стандартного, прочтите здесь: snprintf () ВСЕГДА null прекращение?

0
Community 23 Май 2017 в 11:58