📄 cmdlineargs.h
字号:
#ifndef CMDLINEARGS_H
#define CMDLINEARGS_H
#include <windows.h>
#include <vector>
class CmdLineArgs : public std::vector<char*>
{
public:
CmdLineArgs ()
{
// Save local copy of the command line string, because
// ParseCmdLine() modifies this string while parsing it.
PSZ cmdline = GetCommandLine();
m_cmdline = new char [strlen (cmdline) + 1];
if (m_cmdline)
{
strcpy (m_cmdline, cmdline);
ParseCmdLine();
}
}
~CmdLineArgs()
{
delete m_cmdline;
}
private:
PSZ m_cmdline; // the command line string
////////////////////////////////////////////////////////////////////////////////
// Parse m_cmdline into individual tokens, which are delimited by spaces. If a
// token begins with a quote, then that token is terminated by the next quote
// followed immediately by a space or terminator. This allows tokens to contain
// spaces.
// This input string: This "is" a ""test"" "of the parsing" alg"o"rithm.
// Produces these tokens: This, is, a, "test", of the parsing, alg"o"rithm
////////////////////////////////////////////////////////////////////////////////
void ParseCmdLine ()
{
enum { TERM = '\0',
QUOTE = '\"' };
bool bInQuotes = false;
PSZ pargs = m_cmdline;
while (*pargs)
{
while (isspace (*pargs)) // skip leading whitespace
pargs++;
bInQuotes = (*pargs == QUOTE); // see if this token is quoted
if (bInQuotes) // skip leading quote
pargs++;
push_back (pargs); // store position of current token
// Find next token.
// NOTE: Args are normally terminated by whitespace, unless the
// arg is quoted. That's why we handle the two cases separately,
// even though they are very similar.
if (bInQuotes)
{
// find next quote followed by a space or terminator
while (*pargs &&
!(*pargs == QUOTE && (isspace (pargs[1]) || pargs[1] == TERM)))
pargs++;
if (*pargs)
{
*pargs = TERM; // terminate token
if (pargs[1]) // if quoted token not followed by a terminator
pargs += 2; // advance to next token
}
}
else
{
// skip to next non-whitespace character
while (*pargs && !isspace (*pargs))
pargs++;
if (*pargs && isspace (*pargs)) // end of token
{
*pargs = TERM; // terminate token
pargs++; // advance to next token or terminator
}
}
} // while (*pargs)
} // ParseCmdLine()
}; // class CmdLineArgs
#endif // CMDLINEARGS_H
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -