vsscanf – An Implementation for Windows

Environment: VC++ 6.0, Windows 9x/ME/NT/2000

VC++ provides the vsprintf() function but for some strange reason does not provide the complementary vsscanf() function which is available on most Unix systems. The VC++ library defines a static function called input() which is not exposed to end users. This function is exactly what vsscanf() does.

There are two choices that one has:

  • Extract the input() source from the VC++ CRT sources and use it in your code.
  • Use this alternative implementation

Several C++ implementations exist to plug this hole but most of them do not provide the identical API available on Linux. This implementation enhances the CStringEx::Scanf extension written by Rainer Bauer to provide an identical API to that which is available on Linux.

An example usage of vsscanf() (in a Win32 console application with MFC support) is shown below:

#include “stdafx.h”
#include “vsscanf.h”

CWinApp theApp;

using namespace std;

// ProcessNumEmailMsgs takes variable number of parameters and
// uses vsscanf to parse the parameters.

void ProcessNumEmailMsgs(char *input, char *format, …)
va_list argList;

va_start(argList, format);
vsscanf(input, format, argList);

int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
int nRetCode = 0;

// initialize MFC and print and error on failure
if (!AfxWinInit( ::GetModuleHandle(NULL),
// TODO: change error code to suit your needs
cerr << _T(“Fatal Error: MFC initialization failed”) << endl;
nRetCode = 1;
int startMsg, endMsg, totalMsg;
char *input = “Showing 1 – 10 of 100”;
char *format = “Showing %d – %d of %d”;

// Variable Number of parameters are passed to this
// function

ProcessNumEmailMsgs(input, format, &startMsg, &endMsg, &totalMsg);

printf(“Input String: %sn”, input);
printf(“StartMsg : %dn”, startMsg);
printf(“EndMsg : %dn”, endMsg);
printf(“TotalMsg : %dn”, totalMsg);

return nRetCode;


Download source and demo project – 12 Kb

More by Author

Must Read