dwuwyrazowe komendy

0

Drodzy koledzy programiści!
Ostatnio otrzymałem tutaj błyskawiczną pomoc, dzięki czemu rozwinąłem program. Teraz jednak napotkałem przeszkodę, której samodzielnie nie pokonam.
W mojej grze występują komendy jedno i dwu członowe. Do tej pory pisałem tylko te pierwsze i każda była zapisywana w jednej zminnej. Te dwuwyrazowe (zjedz chleb) chcę zapisywać w dwóch osobnych zmiennych i nie wiem jak teraz miałyby wyglądać te proste (odpoczywaj, north).
Byłbym kontent, gdyby każde polecenie wpisywać w jednym wierszu.
Widziałem podobny temat, ale dotyczył C# i niewiele mi pomógł, toteż założyłem nowy.

Jak zwykle się rozpisałem. Nie potrafię pisać zwięźle. Nie chcielibyście zobaczyć jak wygląda mój kod :p

PS Każdej wpisaną z klawiatury komendzie program przypisuje inta. Nie wiem jak wyświetlić komunikat o niewłaściwym poleceniu.

0

Wczytuj całą linijke do Stringa i w pętli leć po każdym znaku. Jak dojdziesz do spacji to dodajesz słowo do listy/tablicy.

4

Nie baw się w żadne iterowanie po znakach. std::stringstream pozwoli Ci bezboleśnie odnosić się do kolejnych wyrazów:

stringstream splitter{line};

string word;
while(splitter >> word){
    stuff(word);
}

Live example: http://melpon.org/wandbox/permlink/OwhPhVleN7HZH8Sw

edit:
Jak zauważył @stryku, jeśli pobierasz dane z konsoli to od razu używaj std::cin >> word. Mój zalinkowany przykład jest bardziej ogólny.

0

Może czegoś nie rozumiem/nie znam kontekstu, ale z treści tematu wynika, że wystarczy coś takiego

std::cin >> slowo;
//jak wykryjesz, że polecenie jest wielowyrazowe to po prostu dalej std::cin >> slowo itd

@kq Po co stringstream? Ok doczytałem. Jednak chyba dalej wystarczy std::cin

2
std::map<string, std::shared_ptr<ICommand> > commands;
… … …
void Class::ProcessLine(const std::string &line) {
     stringstream sline(line);

     std::string commandName, argument;
     std::vector<std::string> commandArg;

     sline >> commandName;
     while (sline>>argument) {
           commandArg.push_back(argument);
     }
     auto findCmd = commands.find(commandName);
     if (findCmd!=commands.end()) {
           findCmd->second->runCommand(commandArg);
     } else {
           reportUnknownCommand(commandName);
     }
}
0

Na początku napisałem using namespace std; więc nie muszę przepisywać std::
Gra jest konsolowa.
Oba człony chcę zapisywać w osobnych stringach, a jeśli jest jeden wyraz t w pierwszym

1 użytkowników online, w tym zalogowanych: 0, gości: 1