c ++ _vsnprintf неожиданная строка формата - PullRequest
0 голосов
/ 30 апреля 2011

У меня есть функция регистрации, которая принимает переменное число аргументов и использует _vsnprintf для их форматирования. Моя проблема в том, что когда я отлаживаю свою автоматизацию OCR, возвращаемая строка отправляется в журнал, поэтому, если файл говорит что-то вроде этого:

Это растровое изображение говорит% n

тогда это будет отправлено моей функции регистрации следующим образом:

void log(LPCSTR msg, ...)
{
    char log[MAX_ALLOWED];    
    int length = sizeof(log) / sizeof(log[0]);

    va_list argptr;
    va_start( argptr, pzMsg );

    // our msg accidentally has a %
    if ( strchr(msg, '%') ) { 

        // debug assertion - no parameters were passed
        _vsnprintf( log, length, msg, argptr );
    }

    log[length-1] = (char)0;
    va_end( arg_ptr );
}

есть ли способ, наряду с проверкой «%», что я могу проверить, не было ли аргументов? спасибо.

Ответы [ 2 ]

1 голос
/ 30 апреля 2011

Если я вас правильно понимаю, вы хотели бы проверить количество аргументов, фактически переданных log().

К сожалению, это сильно зависит от машины. Я знаю только одну архитектуру, которая обеспечивает однозначный подсчет аргументов. Это VAX. Все остальные зависят от звонящего и вызываемого абонента, чтобы «сделать это правильно».

1 голос
/ 30 апреля 2011

Традиционный способ убедиться, что что-то не может быть расширено с помощью printf, это

log("%s", yourString);

Конечно, вы также можете добавить вариант log, который принимает только один аргумент, или вы можете посчитать количество переменных аргументов и не форматировать строку, если их нет.

...