Linia polecen - c++

0

Witajcie

Zastanawiam się jak najlepiej obsłużyć komendy podawane w wierszu poleceń. Na przykład uruchamiamy program.exe /kn0,12,2 .

/kn to rodzaj komendy a kolejne dane podawane po przecinku są parametrami które będą używane w dalszej części programu.
Dokładniej jak najprościej rozseparować cyferki.

Pozdrawiam

0

scanfem na przykład.
PS cyfra to nie to samo, co liczba.

1

Możesz użyć Boost.Algorithm lub Boost.Tokenizer

    string str = "1,2,34,56,7";

    vector<string> ret;
    boost::algorithm::split(ret,str,bind(equal_to<char>(),',',placeholders::_1));
    string str = "1,2,34,56,7";
    boost::tokenizer<boost::char_separator<char>>(str,boost::char_separator<char>(","))

http://melpon.org/wandbox/permlink/y159GnPZugc4I3gX

Możesz użyć biblioteki standardowej:

regex: http://melpon.org/wandbox/permlink/5UOfIRxzURiS52M7

    string str = "1,2,34,56,7";

    regex rx{R"(\d+)"};

    auto b = sregex_iterator(begin(str), end(str), rx);
    auto e = sregex_iterator();

    for(auto i = b; i != e; ++i){
        DBG(i->str());
    }

lub bardziej prymitywnych narzędzi, takich jak scanf(musisz wiedzieć dokładnie ile liczb)/strtok (nie możesz użyć argumentów main bezpośrednio)/czy stringstreamy (uważaj jakie znaki ignorujesz), zapewne opisanych w postach powyżej.

Jeśli używasz Qt możesz użyć po prostu QString::split:

    QString str = "1,2,34,56,7";

    for(auto const& s : str.split(",")){
        DBG(s.toStdString());
    }
0
mbialas napisał(a):

Witajcie

Zastanawiam się jak najlepiej obsłużyć komendy podawane w wierszu poleceń. Na przykład uruchamiamy program.exe /kn0,12,2 .

/kn to rodzaj komendy a kolejne dane podawane po przecinku są parametrami które będą używane w dalszej części programu.
Dokładniej jak najprościej rozseparować cyferki.

Pozdrawiam

Nie lepiej oddzielać spacją? Jak odróżnisz czy /kn0,12,2 to komenda /kn z parametrami 0 12 i 2, czy komenda /kn0 z parametrami 12 i 2?

0
templas napisał(a):
mbialas napisał(a):

Witajcie

Zastanawiam się jak najlepiej obsłużyć komendy podawane w wierszu poleceń. Na przykład uruchamiamy program.exe /kn0,12,2 .

/kn to rodzaj komendy a kolejne dane podawane po przecinku są parametrami które będą używane w dalszej części programu.
Dokładniej jak najprościej rozseparować cyferki.

Pozdrawiam

Nie lepiej oddzielać spacją? Jak odróżnisz czy /kn0,12,2 to komenda /kn z parametrami 0 12 i 2, czy komenda /kn0 z parametrami 12 i 2?

Witajcie
/kn to komenda pozostałe to parametry. Komendy są dwuliterowe poprzedzone "/". Można faktycznie zrobić /kn,0,1,12,3 . Oddzielanie spacjami może było by fajne ale musimy mocno pilnować aby nie pomiksować komend. Istotna jest również kolejność przekazywanych parametrów.

Pozdrawiam
Marcin

0

lepiej poszukaj jakiejś biblioteki do obsługi argumentów programu (szczególnie jeśli możesz zastąpić przecinki spacjami).
Dla pythona jest super biblioteka argparse https://docs.python.org/dev/library/argparse.html
Dla C++ na pewno znajdzie się coś podobnego (np: https://github.com/weisslj/cpp-argparse).

0
kq napisał(a):

Możesz użyć Boost.Algorithm lub Boost.Tokenizer


string str = "1,2,34,56,7";
vector<string> ret;
boost::algorithm::split(ret,str,bind(equal_to<char>(),',',placeholders::_1));
> 
> 
```cpp
    string str = "1,2,34,56,7";
    boost::tokenizer<boost::char_separator<char>>(str,boost::char_separator<char>(","))

http://melpon.org/wandbox/permlink/y159GnPZugc4I3gX

Możesz użyć biblioteki standardowej:

regex: http://melpon.org/wandbox/permlink/5UOfIRxzURiS52M7


string str = "1,2,34,56,7";
regex rx{R"(\d+)"};

auto b = sregex_iterator(begin(str), end(str), rx);
auto e = sregex_iterator();

for(auto i = b; i != e; ++i){
    DBG(i->str());
}
> 
> lub bardziej prymitywnych narzędzi, takich jak `scanf`(musisz wiedzieć dokładnie ile liczb)/`strtok` (nie możesz użyć argumentów main bezpośrednio)/czy stringstreamy (uważaj jakie znaki ignorujesz), zapewne opisanych w postach powyżej.
> 
> Jeśli używasz Qt możesz użyć po prostu `QString::split`:
> 
```cpp
    QString str = "1,2,34,56,7";

    for(auto const& s : str.split(",")){
        DBG(s.toStdString());
    }

Moze głupie pytanie, ale wybaczcie.
Kq, próbuje użyć twojego rozwiązania ze standardową biblioteką w C++ Buiderze 2010. Cały czas dostaję informację, że "regex rx{R"(\d+)"};" jest niezdefiniowany. Czy jakiś problem ze zgodnością wersji? Biblioteka boost jest zainstalowana w builderze.

Dzięki i pozdrawiam

1

C++ Builder 2010 zapewne nie wspiera C++11 - ale jeśli wspiera to zapewne musisz poszukać jak to włączyć.

std::regex jest nowością w C++11, zamiast niego możesz spróbować Boost.Regex
raw string literals są nowością w C++11 (spróbuj zamiast R"(\d+)" użyć zapisu "\\d+", ale wątpię aby wyłącznie ta zmiana pomogła)

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