podanie kilku spaacji w cudzysłowie nie pomaga, program.exe param1 " " param3?
Tak, można to zrobić i potem w analizie parametrów uwzględnić możliwość występowania cudzysłowu czy innego znaku w takim znaczeniu.
Można też w stylu OSX, czyli program.exe param1\ \ \ param3
, a każdy znak inny niż litera, cyfra poprzedzony backslashem. Oczywiście w interpretacji polecenia trzeba to uwzględnić. Patrząc dalej, w tym stylu program.exe \p\a\r\a\m\1\ \ \ \p\a\r\a\m\3
, po przetworzeniu będzie dokładnie to samo.
Jakkolwiek to zrobisz, nie będzie to przenośne, bo na na Linuksie (na Windowsie nie wiem, podejrzewam że podobnie) za podzielenie linii poleceń na argumenty odpowiada powłoka, a nie system operacyjny. Wołanie systemowe exec przyjmuje już listę stringów i tyle… W związku z tym, hipotetyczne rozwiązanie w Javie wiązałoby się z jakimś brzydkim FFI, w C# pewnie podobnie…
Czyli można przyjąć, ze to, co chcę zrobić, nie jest możliwe, a w aplikacji, której to było, pewnie za pomocą jakiejś funkcji WinAPI da się to otrzymać. Jednak brzydkie i nieprzenośne fikołki mnie nie interesują.
W ogóle nie znam WinAPI, ale jeżeli zamiast main
jest faktycznie WinMain
według https://cpp0x.pl/kursy/Kurs-WinAPI-C++/Podstawy/Podstawy-WinAPI/168 to faktycznie, może polecenie przekazywane jest bez żadnych zmian i dlatego móg być program, który uwzględnia białe znaki w poleceniu. Jak widać, do WinMain wchodzi jeden napis zamiast tablicy. Z drugiej strony, nie rozumiem, jak można zastąpić mail inną funkcją. Skąd system wie, że ma szukać WinMain
, a nie main
? Ja programowałem w Qt i QtCreator zawsze generuje krótki plik cpp, który zawiera normalną funkcję main
, która ma góra 5 linii i wywołuje pierwszą formę.
Też pytanie po co w ogóle ci takie coś… Nie wyobrażam sobie rozsądnego zastosowania dla czegoś takiego…
Tworzyłem niejeden program, gdzie w linii poleceń podaje się parametry działania w stylu klucz=wartość
, kolejność parametrów nieistotna. Póki co, nie miałem potrzeby w ten sposób ppodawać wartości z dwiema spacjami i na 95% nie będzie to potrtzebne, ale pytanie wynika z tego, że w celu poprawnego przetworzenia takiego polecenia, to i tak musze dostać jeden string, a potem przeanalizować po swojemu. Zauważyłem, że do programu wchodzi linia poleceń "na ślepo" podzielona spacjami, po prostu zrobiony string.split(' ')
i do tego pominięte puste pozycje.
Na przykład takie polecenie:
PlikProgramu jakisnapis=qwe innynapis="napis ze spacja" nastepny="napis z wieloma spacjami"
Wydaje się, że powinienem dostać taką tablicę:
args[0] = "jakisnapis=qwe";
args[1] = "innynapis=\"napis";
args[2] = "ze";
args[3] = "spacja\"";
args[4] = "nastepny=\"napis";
args[5] = "z";
args[6] = "";
args[7] = "wieloma";
args[8] = "";
args[9] = "";
args[10] = "spacjami\"";
Po połączeniu wychodzi PlikProgramu jakisnapis=qwe innynapis="napis ze spacja" nastepny="napis z wieloma spacjami"
.
Ale dostaję taką:
args[0] = "jakisnapis=qwe";
args[1] = "innynapis=\"napis";
args[2] = "ze";
args[3] = "spacja\"";
args[4] = "nastepny=\"napis";
args[5] = "z";
args[6] = "wieloma";
args[7] = "spacjami\"";
Po połączeniu wychodzi PlikProgramu jakisnapis=qwe innynapis="napis ze spacja" nastepny="napis z wieloma spacjami"
.
Jeżeli dostanę to pierwsze, to nie byłoby tematu. Ale dostaję to drugie i stąd jest moje pytanie.
W C++ standardowo jest podobnie main(int argc, char *argv[])
, ale czy wycina puste pozycje z tablicy, to nie wiem, nie sprawdzałem.
Na pytanie do czego mi to potrzebne prawdę mówiąc: W celu poprawnego przekazania wartości tekstowej przy implementacji papametryzowania w stylu klucz=wartość. Jeżeli nie jest to możliwe w standardowy sposób z zachowaniem cross-platform, to temat uważam za wyczerpany, bo i tak w ponad 95% nie będzie potrzeby podania wartości z dwiema spacjami, a jak już, to wtedy zastosuje dodatkowe znaki i po sprawie.