Ich schreibe eine Win32-Konsolenanwendung, die mit optionalen Argumenten wie folgt gestartet werden kann:
app.exe /argName1:"argValue" /argName2:"argValue"
Muss ich es manuell analysieren (um festzustellen, welche Argumente vorhanden sind) aus argc/argv-Variablen, oder enthält die Win32-API einige Argumente-Parser?
Siehe die Dokumentation von WinMainkommen die Befehlszeilenparameter als einzelne Zeichenfolge und nicht als argv/argc (obwohl Sie es in diesem Format durch eine andere Funktion erhalten können).
– Ludin
2. Oktober 2012 um 11:23 Uhr
Liho
Es gibt keine Win32-Unterstützung für Parsing Kommandozeilenargumente.
Siehe auch ähnliche Fragen:
Welche Parameter-Parser-Bibliotheken gibt es für C++?
Parsing von Parametern zu main()
Option Parser für C/C++?
Was ist eine effektive Methode zum Analysieren von Befehlszeilenparametern in C++?
…
Die einzige Unterstützung, die Win32 für Befehlszeilenargumente bereitstellt, sind die Funktionen GetCommandLine und CommandLineToArgvW. Dies ist genau das gleiche wie die argv Parameter, den Sie für eine Konsolenanwendung haben.
Sie müssen das Parsing selbst durchführen. Regex wäre dafür eine gute Option.
Sie könnten mit verschiedenen Bibliotheken und anderem herumspielen … Aber manchmal brauchen Sie nur etwas Einfaches, Praktisches und Schnelles:
int i;
char *key, *value;
for( i = 1; i <= argc; i++ ) {
if( *argv[i] == "https://stackoverflow.com/" ) {
key = argv[i] + 1;
value = strchr(key, ':');
if( value != NULL ) *value++ = 0;
process_option( key, value );
} else {
process_value( argv[i] );
}
}
Du hast die Idee…
Dies setzt eine normale Win32-Konsolen-App voraus, wie Sie angedeutet haben (die eine traditionelle main Funktion). Für Win32-Apps kommen Sie ins Spiel WinMain stattdessen, wie eine andere Person bereits kommentiert hat.
Wenn Sie die mit Visual Studio gelieferte CRT verwenden, haben Sie Zugriff auf die Befehlszeilenargumente über die __argc, __argv, __wargv Symbole. Sie werden auch für Anwendungen aufgefüllt, die im WINDOWS-Subsystem ausgeführt werden. Verwenden Sie alternativ den Windows-API-Aufruf CommandLineToArgvW um den Rückgabewert von zu analysieren GetCommandLineW.
– Inspektionsfähig
10. Oktober 2017 um 7:32 Uhr
Nur fürs Protokoll, wenn Sie es verwenden GCC von MinGWanstelle von MSVC von Microsoft, erhalten Sie GNU getopt (das auch die Varianten getopt_long und getopt_long_only enthält), das in der Standard-Laufzeitbibliothek enthalten ist.
Sie können die Argumente mit parsen GetCommandLine, PathRemoveArgs, PathGetArgs in einer Schleife
Spröde, bestenfalls. Von dem Dokumentation: “Diese Funktion sollte nicht für generische Befehlspfadvorlagen (von Benutzern oder der Registrierung) verwendet werden, sondern nur für Vorlagen, von denen die Anwendung weiß, dass sie wohlgeformt sind.” Es ist einfacher und sicherer zu verwenden CommandLineToArgvW stattdessen.
– Inspektionsfähig
10. Oktober 2017 um 7:28 Uhr
Ich habe entwickelt und verwendet libparamset das in einfachem C geschrieben ist. Es ist wirklich mächtig und funktioniert gut unter Windows. Es bietet:
Ist plattformübergreifend.
Wildcard-Unterstützung für die Dateieingabe unter Windows!
Spröde, bestenfalls. Von dem Dokumentation: “Diese Funktion sollte nicht für generische Befehlspfadvorlagen (von Benutzern oder der Registrierung) verwendet werden, sondern nur für Vorlagen, von denen die Anwendung weiß, dass sie wohlgeformt sind.” Es ist einfacher und sicherer zu verwenden CommandLineToArgvW stattdessen.
– Inspektionsfähig
10. Oktober 2017 um 7:28 Uhr
Adi Shavit
Wenn Ihre Bedürfnisse einfach sind, sollten Sie einen Blick darauf werfen Argh!.
Es ist ein einzelner Header und super einfach zu bedienen:
int main(int, char* argv[])
{
argh::parser cmdl(argv); // declare
if (cmdl[{ "-v", "--verbose" }]) // use immediately
std::cout << "Verbose, I am.\n";
return EXIT_SUCCESS;
}
Indem es unaufdringlich ist, übernimmt es Sie nicht main() Funktion.
Aus der Readme:
Philosophie
Im Gegensatz zu vielen Alternativen argh nimmt einen Minimalisten Laissez-faire Ansatz, sehr geeignet für unkompliziertes Prototyping mit den folgenden Regeln:
Die API ist:
Minimalistisch aber ausdrucksstark:
Keine Getter oder Binder
Nur die [] und () Betreiber.
Einfache Iteration (Bereich-for zu).
Sie zahlen nicht für das, was Sie nicht nutzen;
Die Konvertierung in typisierte Variablen erfolgt (via std::istream >>) auf der Benutzerseite nach die Parsing-Phase;
Bei Fehlern werden keine Ausnahmen ausgelöst.
Liberale BSD-Lizenz;
Einzelne Header-Datei;
Nein nicht-std Abhängigkeiten.
argh kümmert sich nicht um:
Wie viele ‘-‘ Ihrer Option vorangestellt;
Welche Flaggen und Optionen Sie unterstützen – das liegt in Ihrer Verantwortung;
Syntaxvalidierung: irgendein Befehlszeile ist ein gültiges (nicht unbedingt einzigartig) Kombination aus positionellen Parameter, Flaggen und Optionen;
Automatische Erstellung einer Nutzungsmeldung.
11372400cookie-checkParsing von Win32-API-Befehlszeilenargumentenyes
note.sonots.com/Comp/CompLang/cpp/getopt.html
– Prof. Falken
2. Oktober 2012 um 11:22 Uhr
Siehe die Dokumentation von WinMainkommen die Befehlszeilenparameter als einzelne Zeichenfolge und nicht als argv/argc (obwohl Sie es in diesem Format durch eine andere Funktion erhalten können).
– Ludin
2. Oktober 2012 um 11:23 Uhr