String einlesen
-
Hi,
ich würde gerne eine Benutzereingabe per Kommandozeile einlesen und in einem String ablegen. Ich muss dabei auch die Gültigkeit der Eingabe überprüfen. Gültige Befehle wären "status" oder "quit", aber auch "echo" gefolgt von weiteren Parametern. Allerdings darf bei "echo" genau 1 Parameter angegeben werden, also zB echo Para1.
Ich kann ja einfach mit getline alles einlesen, da habe ich mit "status" oder "quit" kein Problem. Aber was mache ich im Falle von "echo"?
Liebe Grüße
-
Teil die Zeilen an Leerzeichen auf, dann kannst du die Argumente zählen.
std::vector<std::string> split(std::string s, char delim) { std::istringstream is(s); std::vector<std::string> result; while(std::getline(is, s, delim)) result.push_back(s); return result; }
-
Ein kleiner Quick-And-Dirty Kommandointerpreter:
#include <iostream> #include <sstream> #include <string> #include <map> #include <functional> //das, was bei eingabe von status passieren soll void status_command(std::istream &) { std::cout << "status command" << std::endl; } //das, was bei eingabe von echo passieren soll void echo_command(std::istream & s) { int argument_of_echo_command; s >> argument_of_echo_command; //hier wird der parameter von echo ausgewertet std::cout << "echo command with " << argument_of_echo_command << std::endl; } int main() { //typ fuer commandofunktionen typedef std::function<void (std::istream &)> arg_parser_t; //map um commandos (also strings) auf die dafuer aufzurufende funktion zu mappen typedef std::map<std::string, arg_parser_t> command_map_t; command_map_t command_map; //ein paar kommandos definieren command_map.insert(std::make_pair("status", &status_command)); command_map.insert(std::make_pair("echo", &echo_command)); std::string command; //solange kein fehler und nicht quit while(std::getline(std::cin, command) && command != "quit") { std::istringstream isstr(command); //das kommando selbst holen (string bis zum ersten leerzeichen) isstr >> command; //nach dem kommando suchen command_map_t::const_iterator i = command_map.find(command); if(i != command_map.end()) { //wenn gefunden: ausfuehren (i->second)(isstr); } else { //sonst fehler std::cerr << "Unknown command: " << command << std::endl; } } }Etwas mehr Fehlerprüfung wäre noch gut.
-
Vielen Dank!
