Как правильно заменить sprintf_s на sprintf в C ++ 03?

$ lookup (aggregation)

Выполняет левое внешнее соединение в незащищенном наборе в той же базе данных для фильтрации в документах из «объединенной» коллекции для обработки. Для каждого входного документа этап $ lookup добавляет новое поле массива, элементы которого являются соответствующими документами из «объединенной» коллекции. Эта стадия $ lookup передает эти измененные документы на следующий этап. Этап $ lookup имеет следующие синтаксисы:

Equality Match

Чтобы выполнить совпадение равенства между полем из входных документов с полем из документов «объединенной» коллекции, этап $ lookup имеет следующий синтаксис:

{
   $lookup:
     {
       from: ,
       localField: ,
       foreignField: ,
       as: 
     }
}

Операция будет соответствовать следующему выражению псевдо-SQL:

SELECT *, 
FROM collection
WHERE  IN (SELECT 
                               FROM 
                               WHERE  );

Mongo URL

1
задан Sandburg 17 January 2019 в 15:04
поделиться

1 ответ

Сегодня и snprintf, и vsnprintf должны быть доступны везде, кроме Windows с MSVC12 и старше. Самый простой способ для вас - предоставить snprintf / vsnprintf в Windows, где он недоступен.

Windows предоставляет функцию _vsnprintf_s, которая уже аналогична vsnprintf, но имеет следующие важные различия в отношении того, что происходит, когда буфер слишком мал:

  • Содержимое буфера зависит от count Аргумент, которого нет в vsnprintf. Чтобы получить vsnprintf поведение, вы можете передать _TRUNCATE здесь.
  • -1 возвращается вместо необходимого количества символов. Это можно исправить с помощью функции _vscprintf, которую нужно вызывать только в случае сбоя предыдущего вызова _vsnprintf_s.

Кроме того, эти функции не поддерживают спецификаторы формата, добавленные в C99, такие как %zd. Это не может быть легко решено, вам придется избегать их использования.

Код ниже:

int vsnprintf(char *buf, size_t size, const char *fmt, va_list args)
{
    int r = -1;

    if (size != 0)
    {
        va_list args_copy;
        va_copy(args_copy, args);
        r = _vsnprintf_s(buf, size, _TRUNCATE, fmt, args_copy);
        va_end(args_copy);
    }

    if (r == -1)
    {
        r = _vscprintf(fmt, args);
    }

    return r;
}

int snprintf(char *buf, size_t size, const char *fmt, ...)
{
    va_list args;
    va_start(args, fmt);
    int r = vsnprintf(buf, size, fmt, args);
    va_end(args);
    return r;
}

Примечание: Windows также предоставляет _vsnprintf, который выглядит лучше подходящим для этой реализации, но не завершает результирующую строку. Если вы хотите использовать его, вы должны быть осторожны.

0
ответ дан StaceyGirl 17 January 2019 в 15:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: