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));
	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());
	}

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