Забавно, что до сегодняшнего дня мне это никогда не приходило в голову. Я мог бы поклясться, что использовал эту функцию в прошлом. Но в любом случае, вот решение, которое работает и так же безопасно, как ваши аргументы и строка формата:
template < size_t _NumArgs ></p>
<p>int VSSCANF_S(LPCTSTR strSrc, LPCTSTR ptcFmt, INT_PTR (&arr)[_NumArgs]) {</p>
<pre><code>class vaArgs
{
vaArgs() {}
INT_PTR* m_args[_NumArgs];
public:
vaArgs(INT_PTR (&arr)[_NumArgs])
{
for(size_t nIndex=0;nIndex<_NumArgs;++nIndex)
m_args[nIndex] = &arr[nIndex];
}
};
return sscanf_s(strSrc, ptcFmt, vaArgs(arr));
}
/////////////////////////////////////////////// ////////////////////////////////
int _tmain (int, LPCTSTR argv [])
{
INT_PTR args[3];
int nScanned = VSSCANF_S(_T("-52 Hello 456 @"), _T("%d Hello %u %c"), args);
return printf(_T("Arg1 = %d, arg2 = %u, arg3 = %c\n"), args[0], args[1], args[2]);
}
Из:
Arg1 = -52, arg2 = 456, arg3 = @
Нажмите любую клавишу для продолжения . , ,
Ну, я не могу правильно отформатировать, но вы поняли идею.