Wie überprüfe ich, ob ein C ++ & lt; String & gt; beginnt mit einer bestimmten Zeichenfolge und konvertiert eine Teilzeichenfolge in ein int?
Wie mache ich das folgende (Python-pseudocode) in C++?
if argv[1].startswith('--foo='):
foo_value = int(argv[1][len('--foo='):])
(Zum Beispiel, wenn argv[1] '--foo=98', dann foo_value ist 98.)
Update: ich bin zögerlich, um zu schauen, in Boost, da bin ich gerade auf der Suche zu machen, eine sehr kleine änderung, um eine kleine Befehlszeile Werkzeug. (Ich würde lieber nicht haben, um zu lernen, wie zu verlinken und die Verwendung von Boost für eine geringfügige änderung.)
InformationsquelleAutor der Frage Daryl Spitzer | 2009-12-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie mit Boost, die Sie tun können, es mit boost string algorithmen + boost-lexical-cast:
Wie die meisten boost-Bibliotheken, string-Algorithmus & lexikalische Besetzung sind header-only, es gibt nichts zu verlinken.
Diese Art von Ansatz, wie viele der anderen Antworten hier ist ok für sehr einfache Aufgaben, aber im langen Lauf Sie sind in der Regel besser über ein command line parsing library. Boost hat ein (Boost.Program_options), was Sinn machen würde, wenn Sie passieren zu sein mit Boost schon.
Sonst eine Suche nach "c++ - Kommandozeilen-parser" wird der Ertrag einer Reihe von Optionen.
InformationsquelleAutor der Antwort Ferruccio
Würden Sie es so machen:
Suchen für eine Bibliothek wie Boost.ProgramOptions, dass dies für Sie ist auch eine gute Idee.
InformationsquelleAutor der Antwort Thomas
Nur der Vollständigkeit halber erwähne ich das C Weg, es zu tun:
(Zitat von Yasin Rauf hiermarkup Hinzugefügt)
Für eine groß- /Kleinschreibung-Vergleich, nutzen
strnicmp
stattstrncmp
.Dies ist das C Weg, es zu tun, für die C++ - strings können Sie verwenden die gleiche Funktion wie diese:
InformationsquelleAutor der Antwort Felix Dombek
Wer braucht noch was? Reine STL!
InformationsquelleAutor der Antwort user3046585
Code, den ich selbst benutze:
InformationsquelleAutor der Antwort Hüseyin Yağlı
Niemand verwendet die STL Algorithmus/mismatch Funktion noch nicht. Wenn diese true zurückgibt, Präfix ist ein Präfix von 'toCheck':
Vollständiges Beispiel prog:
Edit:
Als @James T. Huggett schlägt vor, std::equal ist eine bessere Passform für die Frage: Ist Ein Präfix von B? und ist leicht kürzer-code:
Vollständiges Beispiel prog:
InformationsquelleAutor der Antwort matiu
Gegeben, dass beide Zeichenfolgen —
argv[1]
und"--foo"
— sind C-strings, @FelixDombek Antwort ist die Hände-down die beste Lösung.Sehen die anderen Antworten, aber ich dachte es erwähnenswert, dass, wenn Ihr text bereits als ein
std::string
dann eine einfache, null-Kopie, die maximal effiziente Lösung existiert, die noch nicht erwähnt wurde bisher:Und wenn foo bereits ein string:
InformationsquelleAutor der Antwort Marcelo Cantos
Auf die Gefahr geflamed zu werden für die Verwendung von C-Konstrukten, ich denke, das
sscanf
Beispiel ist eleganter als die meisten Boost-Lösungen. Und Sie müssen nicht sorgen zu machen über die Verknüpfung, wenn Sie überall, dass hat einen Python-interpreter!Hier einige Beispiel-Ausgabe zeigt, dass die Lösung verarbeitet leading/trailing garbage als richtig, wie die entsprechenden Python-code, und mehr richtig, als alles, was mit
atoi
(die fälschlicherweise ignorieren eine nicht-numerische suffix).InformationsquelleAutor der Antwort Tom
Verwendung von STL-dies Aussehen könnte:
InformationsquelleAutor der Antwort razvanco13
Warum nicht gnu getopts? Hier ist ein einfaches Beispiel (ohne Sicherheitsprüfung):
Für den folgenden Befehl ein:
Erhalten Sie
InformationsquelleAutor der Antwort Carl Cook
Benutze ich
std::string::compare
verpackt in utility-Methode wie folgt:InformationsquelleAutor der Antwort ShitalShah
Können Sie auch
strstr
:aber ich denke, es ist nur gut für kurze strings, da hat es eine Schleife über den gesamten string, wenn der string nicht tatsächlich beginnen mit 'substr'.
InformationsquelleAutor der Antwort szx
Ok, warum die komplizierte Nutzung von Bibliotheken und Sachen? C++ String-Objekte überladen des [] - operator, so können Sie einfach vergleichen chars.. Wie das, was ich gerade getan habe, weil ich will, um eine Liste aller Dateien in einem Verzeichnis und ignorieren Sie unsichtbare Dateien und .. und . pseudofiles.
So einfach ist das..
InformationsquelleAutor der Antwort Nils
InformationsquelleAutor der Antwort mois
InformationsquelleAutor der Antwort Macsinus
zwar bin ich 8 Jahre zu spät auf die party, hier ist die einfachste do-it-yourself Weg, es zu tun:
InformationsquelleAutor der Antwort 7kemZmani
Mit C++17, die Sie verwenden können
std::basic_string_view
& mit C++20std::basic_string::starts_with
oderstd::basic_string_view::starts_with
.Nutzen
std::string_view
im Vergleich zustd::string
- in Bezug auf Speicher-management - ist, dass es hält nur ein Zeiger auf einen "string" (zusammenhängende Sequenz von char-ähnlichen Objekte) und kennt seine Größe. Beispiel ohne verschieben/kopieren die Quell-strings, nur um mit den integer-Wert:InformationsquelleAutor der Antwort Roi Danton
Seit C++11 auch std::regex_search verwendet werden kann, z.B. wie folgt (eine leere Zeichenfolge zurück, im Fehlerfall):
InformationsquelleAutor der Antwort alextoind
Dies ist völlig ungetestet. Das Prinzip ist das gleiche wie der Python. Erfordert Steigern.StringAlgo und zu Steigern.LexicalCast.
Prüfen, ob der string beginnt mit der anderen Schnur, und dann Holen Sie sich die substring ('slice') des ersten string ein und wandeln es mithilfe von lexikalischen Besetzung.
InformationsquelleAutor der Antwort blwy10