Witam,
Mam problem z wczytywaniem argumentów przesyłanych przy uruchamianiu programu. Danymi wejściowymi są liczby w nawiasach kwadratowych [ i ], które muszę wczytać do stringów (pierwszy nawias to pierwszy string, drugi to drugi, itd.). Problem w tym, że liczby te oddzielone są spacjami i program odczytuje je niepoprawnie. Czy jest jakaś funkcja, która umożliwia wczytywanie do stringa do momentu pojawienia się nawiasu zamykacjącego?
aż się prosi o kilka przykładów linii poleceń, by wszystko było jasne.
Czemu nie użyjesz " " (cudzysłów)? Wtedy liczby wewnątrz nie zostaną rozdzielone.
Podaj przykład, który ukazuje jak twój program jest uruchamiany i co chcesz dokładnie wyciągnąć, bo nie bardzo rozumiem czy wygląda to tak:
porgram.exe [ 1 2 3 4]
czy tak:
program.exe [1] [2] [3] [4]
?
Dane wyglądają na przykład tak:
[1 2 3 4]
Faktycznie po wzięciu w cudzysłów zaczyna działać. Dzięki za pomoc ;) A da się to jakoś zrobić, żeby można było wczytywać te dane bez cudzysłowu?
Korzystając z biblioteki standardowej chyba nie. Musiałbyś użyć API systemowego, pod Windowsem jest GetCommandLine()
, a potem musisz parsować samemu.
Pod Linuksem chyba nie ma łatwego sposobu aby uzyskać wiersz poleceń nie podzielony na poszczególne argumenty – ale za to jest biblioteka getopt o dużych możliwościach.
Możesz też przecież pójść na łatwiznę, łącząc wszystkie argumenty ze sobą do jednego stringa dodając spację pomiędzy nimi.
Racja. Dzięki wielkie ;)
Na windowsie korzystanie z prototypu main'a
int WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{/*...*/}
Od razu rozwiązuje problem, gdyż wszystkie argumenty rozdzielone spacjami już są w lpCmdLine.
Azarien napisał(a)
Pod Linuksem chyba nie ma łatwego sposobu aby uzyskać wiersz poleceń nie podzielony na poszczególne argumenty
Można wczytać zawartość pliku /proc/[PID]/cmdline, ale tam elementy są rozdzielone bajtem zerowym, nie spacją. Ale to overkill. W Unices, argumenty zawierające spacje lub znaki kontrolne muszą być umieszczone w cudzysłowie. Robienie tego w inny sposób (np. łączenie argumentów w jeden ciąg) jest mylące.
Można wczytać zawartość pliku /proc/[PID]/cmdline, ale tam elementy są rozdzielone bajtem zerowym, nie spacją
pod warunkiem że jest zamontowane/proc
, co nie jest pewne (to akurat w Linuksieproc
jest bardzo ważny dla systemu)
Poczytałem trochę o temacie, i wychodzi na to, że w Uniksach aplikacja dostaje od systemu linię poleceń już podzieloną na parametry (czyli nie istnieje linia w postaci jednego stringa, chyba że sami go sobie skleimy), a pod Windowsem linia poleceń jest właśnie jednym stringiem, który trzeba sobie dopiero podzielić (to że w C mamy argc i argv to zasługa runtime'a który dzieli linię za nas)
Powód przeniesienia: Wątek dotyczący podstaw
ja bym nie powiedział, że to takie podstawy.
Jako że przekazywanie parametrów jest ściśle związane ze spacjami proponuję zmienić format. Np. dodaj taki wymóg aby liczby były oddzielone nie spacją, a przecinkiem (już bez nawiasów):
porgram.exe 1,2,3 11,12,13
Albo niech separatorem ciągów będzie jakiś określony parametr np.
porgram.exe /x 1 2 3 /x 11 12 13