Como Parsear Argc Argv para um map STL

Jan 26, 2018

Os clássicos argv/argc são úteis quando os parâmetros de um programa são conhecidos e geralmente obrigatórios (até a ordem pode ser obrigatória). Isso funciona muito bem para C. Porém, há a possibilidade de STLzar esses argumentos de forma simples, usando a lógica *nix de fazer as coisas e transformando tudo em um map de string para string. E tudo isso cabe em uma função pequena que você pode copiar e levar com você em seu cinto de utilidades:

/** Interpreta argumentos da linha de comando.

@author Wanderley Caloni <caloni@intelitrader.com.br>
@date 2015-06
@version 1.0.0
*/
#pragma once
#include <map>
#include <string>

typedef std::map<std::string, std::string> Args;

inline void ParseCommandLine(int argc, char* argv[], Args& args)
{
	for (int i = 1; i < argc; ++i)
	{
		std::string cmd = argv[i];
		std::string arg;
		if (i < argc - 1 && argv[i + 1][0] != '-')
		{
			arg = argv[i + 1];
			++i;
		}
		args[cmd] = arg;
	}
}

Com a função ParseCommandLine disponível assim que você adicionar este header (eu chamo de args.h) basta no início do seu main chamá-lo passando o argv e o argc recebidos:

int main(int argc, char* argv[])
{
	Args args;
	ParseCommandLine(argc, argv, args);
    // ...

O resultado é que a variável args irá conter um mapa entre parâmetros e valores. Se seu programa for chamado com, por exemplo, a seguinte linha de comando:

>program.exe --name Agatha --surname Christie --enable-log

A variável args irá conter três elementos: “–name”, “–surname” e “–enable-log”. Nos dois primeiros ele irá entregar os valores respectivos “Agatha” e “Christie” se indexado (args[“–name”], por exemplo). No terceiro elemento o valor é uma string vazia. Apenas a existência dele é o flag. Costumo usar isso para conseguir depurar por parâmetro:

if( args.find("--debug") != args.end() )
{
    while( ! IsDebuggerPresent() )
        Sleep(1000);
}

De maneira geral argv/argc já estão divididos quando o programa começa. O que o ParseCommandLine faz é apenas entregar os parâmetros formatados da maneira usual para tratarmos rapidamente as opções passadas dinamicamente para o programa.

Como Parsear Argc Argv para um map STL, by Wanderley Caloni. 2018-01-26.