command-line argument (tsz. command-line arguments)
A parancssori argumentumokat a parancssorból (például Linux terminálból vagy Windows CMD/Powershellből) lehet megadni a program elindításakor, és a program a futása során ezekhez az értékekhez hozzáférhet.
Egy parancssori argumentum nem más, mint egy karakterlánc (string), amit a parancssorban gépelünk be a program neve után. A rendszer (operációs rendszer vagy shell) ezeket az argumentumokat egy tömbbe helyezi, és átadja őket a programnak a belépési pontban (pl. main
függvényben).
Például:
./myprogram file.txt 100 verbose
Itt a myprogram
a futtatható program neve, a következő három elem pedig parancssori argumentum:
"file.txt"
"100"
"verbose"
A legtöbb programnyelvben a main
függvény speciális szignatúrával rendelkezhet, amely lehetővé teszi az argumentumok fogadását. C++-ban (és C-ben) ez így néz ki:
int main(int argc, char* argv)
argc
(argument count): egy egész szám, ami megadja, hány argumentumot kaptunk (beleértve magát a program nevét is).argv
(argument vector): egy karakterláncokra (stringekre) mutató pointerek tömbje, ahol az egyes argv
elemek az argumentumok szöveges tartalmát tartalmazzák.
argv
mindig a program neve (teljes elérési úttal vagy anélkül).argv
az első valódi argumentum.argv
, argv
, stb. a további argumentumok.
#include <iostream>
int main(int argc, char* argv) {
std::cout << "Number of arguments: " << argc << std::endl;
for (int i = 0; i < argc; ++i) {
std::cout << "Argument " << i << ": " << argv << std::endl;
}
return 0;
}
Ha ezt így futtatjuk:
./myprogram apple banana cherry
A kimenet:
Number of arguments: 4 Argument 0: ./myprogram Argument 1: apple Argument 2: banana Argument 3: cherry
A program futtatásakor meghatározhatunk viselkedést:
./backup.sh /home/user/documents --compress --verbose
Itt pl. a --compress
és --verbose
argumentumok befolyásolják, hogy a backup.sh
mit csináljon.
Sok programnál a bemeneti vagy kimeneti fájlt is parancssori argumentumban adjuk meg:
./image_converter input.jpg output.png
Paraméterekkel beállíthatunk futás közbeni értékeket:
./simulation 1000 0.05 50
Mivel az argumentumok szövegként érkeznek, ha számként vagy más típusú adatként akarjuk őket használni, konvertálni kell őket.
#include <iostream>
#include <cstdlib> // atoi, atof
int main(int argc, char* argv) {
if (argc != 3) {
std::cerr << "Usage: " << argv << " <int> <double>" << std::endl;
return 1;
}
int a = std::atoi(argv); // string -> int
double b = std::atof(argv); // string -> double
std::cout << "a + b = " << (a + b) << std::endl;
return 0;
}
Futtatás:
./program 10 3.14
Kimenet:
a + b = 13.14
./compress input.txt output.txt
-
vagy --
prefixű.
./program --verbose --dry-run -o output.txt
myprogram <inputfile>
Példák opciókra:
./myprogram -h # help
./myprogram -v # verbose
./myprogram -o result.txt file.txt
A parancssori opciók feldolgozása néha kézzel történik, de vannak könyvtárak is, amelyek megkönnyítik.
for (int i = 1; i < argc; ++i) {
std::string arg = argv;
if (arg == "-h" || arg == "--help") {
std::cout << "Help message\n";
} else if (arg == "-v" || arg == "--verbose") {
std::cout << "Verbose mode ON\n";
} else {
std::cout << "Unknown argument: " << arg << std::endl;
}
}
if (argc < 2) {
std::cerr << "Usage: " << argv << " <filename>\n";
return 1;
}
char* argv
típus nem garantálja Unicode kompatibilitást.wmain(int argc, wchar_t* argv)
verzióval Unicode parancssori argumentumokat is fogadhatunk.
A command-line argument egy nagyon egyszerű, de erőteljes eszköz:
main(int argc, char* argv)
mechanizmussal kapjuk meg őket.