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! 🙂


Anmelden zum Antworten