7.Β ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΌΠΎΠ³ΡΡ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ Π΄Π»ΠΈΠ½Π½ΡΠΌ ΠΎΠΏΡΠΈΡΠΌ Π½Π°ΡΠΈΠ½Π°ΡΡΡΡ Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ΅ΡΡΠΎΡΠΊΠΈ (ΠΡΠΎ ΡΠΈΠΏΠΈΡΠ½ΠΎ Π΄Π»Ρ ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ X Window.)
ΠΠ½ΠΎΠ³ΠΎΠ΅ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΡΡΠ°Π½Π΅Ρ ΡΡΠ½Π΅Π΅, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ·ΠΆΠ΅ Π² ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ
getopt_long()GNU Coding Standards ΡΠ΄Π΅Π»ΡΠ΅Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ Π΄Π»ΠΈΠ½Π½ΡΡ ΠΈ ΠΊΠΎΡΠΎΡΠΊΠΈΡ ΠΎΠΏΡΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°ΠΌΠΈ GNU. ΠΡΠ»ΠΈ Π²Ρ ΠΏΠΈΡΠ΅ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»ΠΈΠ½Π½ΡΠ΅ ΠΎΠΏΡΠΈΠΈ, ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅, Π½Π΅Ρ Π»ΠΈ ΡΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΡ ΡΡ ΠΈΠΌΠ΅Π½ ΠΎΠΏΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠΌΠ΅Π»ΠΎ Π±Ρ ΡΠΌΡΡΠ» ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈ Π²Π°ΠΌ.
2.2. ΠΠ°Π·ΠΎΠ²Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π° Π‘ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ²ΠΎΠΈΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΡΠ΅ΡΠ΅Π· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ
argcargvargcmain()argcint main(int argc, char *argv[])Β int main(int argc, char **argv){Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β {...Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β ...}Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β }ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΠΌΡ ΡΡΠΈΠΌΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡΠΌΠΈ Π½Π΅Ρ ΡΠ°Π·Π½ΠΈΡΡ, Ρ ΠΎΡΡ ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΡΠ°Π»ΡΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ½ΡΡΠ½ΠΎ:
argc
Π ΠΈΡ. 2.2. ΠΠ°ΠΌΡΡΡ Π΄Π»Ρ
argcΠΠΎ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΡ,
argv[0]argv[0]argvNULLargcargv[argc] == NULLargcargv[i] == 0*argv != NULL2.2.1. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°
echoΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡΠΎΡΡΠ΅ΠΉΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° V7
echo,-n1Β #include <stdio.h>23Β main(argc, argv) /*int main(int argc, char **argv)*/4Β int argc;5Β char *argv[];6Β {7Β Β register int i, nflg;89Β Β nflg = 0;10Β if (argc > 1 && argv[1][0] == && argv[1][1] == 'n') {11Β Β nflg++;12Β Β Β argc--;13Β Β Β argv++;14Β Β }15Β Β for (i=1; i<argc; i++) {16Β Β fputs(argv[i], stdout);17Β Β if (i < argc-1)18Β Β putchar(' ');19Β Β }20Β Β if (nflg == 0)21Β Β putchar('\n');22Β Β exit(0);23Β }ΠΡΠ΅Π³ΠΎ 23 ΡΡΡΠΎΠΊΠΈ! ΠΠ΄Π΅ΡΡ Π΅ΡΡΡ Π΄Π²Π° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ ΠΌΠΎΠΌΠ΅Π½ΡΠ°. ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΠ΅
argcargv-n-no-newline-at-the-endΠ ΡΡΠ½ΠΎΠΉ ΡΠ°Π·Π±ΠΎΡ ΠΎΠΏΡΠΈΠΉ ΠΎΠ±ΡΡΠ΅Π½ Π΄Π»Ρ ΠΊΠΎΠ΄Π° V7, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠ½ΠΊΡΠΈΡ
getopt()ΠΠ°ΠΊΠΎΠ½Π΅Ρ, Π·Π΄Π΅ΡΡ ΠΈ Π² Π΄ΡΡΠ³ΠΈΡ ΠΌΠ΅ΡΡΠ°Ρ ΠΏΠΎ Π²ΡΠ΅ΠΉ ΠΊΠ½ΠΈΠ³Π΅, ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° register. ΠΠ΄Π½ΠΎ Π²ΡΠ΅ΠΌΡ ΡΡΠΎ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ Π΄Π°Π²Π°Π»ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΡ, ΡΡΠΎ Π΄Π°Π½Π½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΡΡΡΡ Π² ΡΠ΅Π³ΠΈΡΡΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°. Π’Π΅ΠΏΠ΅ΡΡ ΡΡΠΎ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ ΡΡΡΠ°ΡΠ΅Π»ΠΎ; ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ Π²ΡΠ΅ ΠΎΡΠ½ΠΎΠ²ΡΠ²Π°ΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π² ΡΠ΅Π³ΠΈΡΡΡΠ°Ρ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π΅ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΈΠ³Π½ΠΎΡΠΈΡΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ
register2.3. Π Π°Π·Π±ΠΎΡ ΠΎΠΏΡΠΈΠΉ:
getopt()getopt_long()ΠΡΠΈΠΌΠ΅ΡΠ½ΠΎ Π² 1980-Ρ Π³ΡΡΠΏΠΏΠ° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Unix Π΄Π»Ρ System III Π² AT&T Π·Π°ΠΌΠ΅ΡΠΈΠ»Π°, ΡΡΠΎ ΠΊΠ°ΠΆΠ΄Π°Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Unix ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π»Π° Π΄Π»Ρ ΡΠ°Π·Π±ΠΎΡΠ° Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠΎΠ² ΡΠ²ΠΎΠΈ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π½ΡΠ΅ ΠΌΠ΅ΡΠΎΠ΄ΠΈΠΊΠΈ. Π§ΡΠΎΠ±Ρ ΠΎΠ±Π»Π΅Π³ΡΠΈΡΡ ΡΠ°Π±ΠΎΡΡ ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»Π΅ΠΉ ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΡΠΎΠ², ΠΎΠ½ΠΈ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π»ΠΈ Π±ΠΎΠ»ΡΡΠΈΠ½ΡΡΠ²ΠΎ ΠΈΠ· ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½Π½ΡΡ ΡΠ°Π½Π΅Π΅ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΠΉ. (Π₯ΠΎΡΡ ΠΈΠ·Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² System III ΡΠΏΡΠ°Π²ΠΊΠΈ Π΄Π»Ρ intro(1) Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎ ΠΌΠ΅Π½Π΅Π΅ ΡΠΎΡΠΌΠ°Π»ΡΠ½ΠΎ, ΡΠ΅ΠΌ Π² ΡΡΠ°Π½Π΄Π°ΡΡΠ΅ POSIX.)
ΠΡΡΠΏΠΏΠ° ΠΏΠΎΠ΄Π΄Π΅ΡΠΆΠΊΠΈ Unix ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°Π»Π° ΡΠ°ΠΊΠΆΠ΅ ΡΡΠ½ΠΊΡΠΈΡ
getopt()getopt_long()getopt()2.3.1. ΠΠΏΡΠΈΠΈ Ρ ΠΎΠ΄Π½ΠΈΠΌ ΡΠΈΠΌΠ²ΠΎΠ»ΠΎΠΌ
Π€ΡΠ½ΠΊΡΠΈΡ
getopt()#include <unistd.h> /*POSIX*/int getopt(int argc, char *const argv[], const char *optstring);extern char *optarg;extern int optind, opterr, optopt;ΠΡΠ³ΡΠΌΠ΅Π½ΡΡ
argcargvmain()optstring