C++: int argc, char* argv[]

0

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?

0

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.

0

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]
?

0

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?

0

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.

0

Racja. Dzięki wielkie ;)

0

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.

0
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.

0

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 Linuksie proc 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.

0

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

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