2014-01-02 3 views
-3

У меня есть функция справки, как это:почему _vsnprintf вызывает ошибку

wchar* CHelpTool::PrintfToWstrFromStr(const char *content, ...) 
{ 
    va_list argp; 
    va_start(argp, content); 
    int nLenstr = strlen(content); 
    char* pstrNum = (char*)MALLOC(nLenstr+50); 
    LOG("PrintfToWstrFromStr11111111111111111111111111111111111111111111"); 
    LOG("PrintfToWstrFromStr pstrNum ====================================%s", pstrNum); 
    LOG("PrintfToWstrFromStr nLenstr ====================================%d", nLenstr); 
    LOG("PrintfToWstrFromStr content ====================================%s", content); 
    _vsnprintf(pstrNum, nLenstr+50-1, content, argp); 
    LOG("PrintfToWstrFromStr2222222222222222222222222222222222222222222222"); 
    AECHAR* wpstrNum = CHelpTool::StrToWstr(pstrNum); 
    FREEIF(pstrNum); 
    va_end(argp); 

    return wpstrNum; 
} 

Когда дело доходит до _vsnprintf, программа рушится.
и бревно:

pstrNum ==================================== 
nLenstr ====================================68 
content ====================================Gi?m phòng ??ch, t?ng %d%% sát th??ng, kéo dài 2 l??t 

Это идет хорошо записке function _vsnprintf.

В чем проблема с моей функцией?

+2

Что происходит в вашем отладчике? – norlesh

+0

Хорошо, убедитесь сами, что такое 'pstrNum'. –

+0

Когда 'LOG'ging' pstrNum', вы сбрасываете неинициализированные данные. Чего вы ожидали? И поскольку вы каким-то образом пытаетесь преобразовать строку MBCS в строку Unicode, 'LOG'' content' может быть правильным. Просто не правильная кодировка. ** Подсказка: ** Почему бы не использовать реализацию «LOG» в качестве вдохновения? Если это не было написано самим собой, скорее всего, это не так плохо, как ваш код. – IInspectable

ответ

0

strlen() возвращает неправильное значение, content явно длиннее 18 символов (68-50). Похоже, у вас есть строка из нескольких байт передаются, вы можете иметь

int nLenstr = mblen(content, MB_CUR_MAX); 

Это поможет вам правильную длину строки.

Что касается аварии. Я собираюсь угадать, что _vsnprintf() не может обрабатывать конец буфера в середине многобайтовой последовательности.

Смежные вопросы