7.Β ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΡ ΠΌΠΎΠ³ΡΡ ΡΠ°Π·ΡΠ΅ΡΠΈΡΡ Π΄Π»ΠΈΠ½Π½ΡΠΌ ΠΎΠΏΡΠΈΡΠΌ Π½Π°ΡΠΈΠ½Π°ΡΡΡΡ Ρ ΠΎΠ΄Π½ΠΎΠΉ ΡΠ΅ΡΡΠΎΡΠΊΠΈ (ΠΡΠΎ ΡΠΈΠΏΠΈΡΠ½ΠΎ Π΄Π»Ρ ΠΌΠ½ΠΎΠ³ΠΈΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌ X Window.)
ΠΠ½ΠΎΠ³ΠΎΠ΅ ΠΈΠ· ΡΡΠΎΠ³ΠΎ ΡΡΠ°Π½Π΅Ρ ΡΡΠ½Π΅Π΅, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ·ΠΆΠ΅ Π² ΡΡΠΎΠΉ Π³Π»Π°Π²Π΅ ΠΌΡ ΡΠ°ΡΡΠΌΠΎΡΡΠΈΠΌ
getopt_long()
GNU Coding Standards ΡΠ΄Π΅Π»ΡΠ΅Ρ Π·Π½Π°ΡΠΈΡΠ΅Π»ΡΠ½ΠΎΠ΅ ΠΌΠ΅ΡΡΠΎ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠ»Π΅Π½ΠΈΡ Π²ΡΠ΅Ρ Π΄Π»ΠΈΠ½Π½ΡΡ ΠΈ ΠΊΠΎΡΠΎΡΠΊΠΈΡ ΠΎΠΏΡΠΈΠΉ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠ΅ΠΌΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°ΠΌΠΈ GNU. ΠΡΠ»ΠΈ Π²Ρ ΠΏΠΈΡΠ΅ΡΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΡΡ Π΄Π»ΠΈΠ½Π½ΡΠ΅ ΠΎΠΏΡΠΈΠΈ, ΠΏΠΎΡΠΌΠΎΡΡΠΈΡΠ΅, Π½Π΅Ρ Π»ΠΈ ΡΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΡΡΠΈΡ ΡΡ ΠΈΠΌΠ΅Π½ ΠΎΠΏΡΠΈΠΉ, ΠΊΠΎΡΠΎΡΡΠ΅ ΠΈΠΌΠ΅Π»ΠΎ Π±Ρ ΡΠΌΡΡΠ» ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΈ Π²Π°ΠΌ.
2.2. ΠΠ°Π·ΠΎΠ²Π°Ρ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠ° ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ
ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° Π½Π° Π‘ ΠΏΠΎΠ»ΡΡΠ°Π΅Ρ Π΄ΠΎΡΡΡΠΏ ΠΊ ΡΠ²ΠΎΠΈΠΌ Π°ΡΠ³ΡΠΌΠ΅Π½ΡΠ°ΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΡΠ΅ΡΠ΅Π· ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ
argc
argv
argc
main()
argc
int main(int argc, char *argv[])Β int main(int argc, char **argv)
{Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β {
...Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β ...
}Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β Β }
ΠΡΠ°ΠΊΡΠΈΡΠ΅ΡΠΊΠΈ ΠΌΠ΅ΠΆΠ΄Ρ Π΄Π²ΡΠΌΡ ΡΡΠΈΠΌΠΈ ΠΎΠ±ΡΡΠ²Π»Π΅Π½ΠΈΡΠΌΠΈ Π½Π΅Ρ ΡΠ°Π·Π½ΠΈΡΡ, Ρ ΠΎΡΡ ΠΏΠ΅ΡΠ²ΠΎΠ΅ ΠΊΠΎΠ½ΡΠ΅ΠΏΡΡΠ°Π»ΡΠ½ΠΎ Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ½ΡΡΠ½ΠΎ:
argc
Π ΠΈΡ. 2.2. ΠΠ°ΠΌΡΡΡ Π΄Π»Ρ
argc
ΠΠΎ ΡΠΎΠ³Π»Π°ΡΠ΅Π½ΠΈΡ,
argv[0]
argv[0]
argv
NULL
argc
argv[argc] == NULL
argc
argv[i] == 0
*argv != NULL
2.2.1. ΠΡΠΎΠ³ΡΠ°ΠΌΠΌΠ°
echo
ΠΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, ΠΏΡΠΎΡΡΠ΅ΠΉΡΠΈΠΌ ΠΏΡΠΈΠΌΠ΅ΡΠΎΠΌ ΠΎΠ±ΡΠ°Π±ΠΎΡΠΊΠΈ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠΈ ΡΠ²Π»ΡΠ΅ΡΡΡ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠ° V7
echo,
-n
1Β #include <stdio.h>
2
3Β main(argc, argv) /*int main(int argc, char **argv)*/
4Β int argc;
5Β char *argv[];
6Β {
7Β Β register int i, nflg;
8
9Β Β 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 ΡΡΡΠΎΠΊΠΈ! ΠΠ΄Π΅ΡΡ Π΅ΡΡΡ Π΄Π²Π° ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΡΡ ΠΌΠΎΠΌΠ΅Π½ΡΠ°. ΠΠΎ-ΠΏΠ΅ΡΠ²ΡΡ , ΡΠΌΠ΅Π½ΡΡΠ΅Π½ΠΈΠ΅
argc
argv
-n
-no-newline-at-the-end
Π ΡΡΠ½ΠΎΠΉ ΡΠ°Π·Π±ΠΎΡ ΠΎΠΏΡΠΈΠΉ ΠΎΠ±ΡΡΠ΅Π½ Π΄Π»Ρ ΠΊΠΎΠ΄Π° V7, ΠΏΠΎΡΠΊΠΎΠ»ΡΠΊΡ ΡΡΠ½ΠΊΡΠΈΡ
getopt()
ΠΠ°ΠΊΠΎΠ½Π΅Ρ, Π·Π΄Π΅ΡΡ ΠΈ Π² Π΄ΡΡΠ³ΠΈΡ ΠΌΠ΅ΡΡΠ°Ρ ΠΏΠΎ Π²ΡΠ΅ΠΉ ΠΊΠ½ΠΈΠ³Π΅, ΠΌΡ Π²ΠΈΠ΄ΠΈΠΌ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ³ΠΎ ΡΠ»ΠΎΠ²Π° register. ΠΠ΄Π½ΠΎ Π²ΡΠ΅ΠΌΡ ΡΡΠΎ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ Π΄Π°Π²Π°Π»ΠΎ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ ΠΏΠΎΠ΄ΡΠΊΠ°Π·ΠΊΡ, ΡΡΠΎ Π΄Π°Π½Π½Π°Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½Π°Ρ Π΄ΠΎΠ»ΠΆΠ½Π° ΠΏΠΎ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ°Π·ΠΌΠ΅ΡΠ°ΡΡΡΡ Π² ΡΠ΅Π³ΠΈΡΡΡΠ΅ ΠΏΡΠΎΡΠ΅ΡΡΠΎΡΠ°. Π’Π΅ΠΏΠ΅ΡΡ ΡΡΠΎ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ ΡΡΡΠ°ΡΠ΅Π»ΠΎ; ΡΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡΠΎΡΡ Π²ΡΠ΅ ΠΎΡΠ½ΠΎΠ²ΡΠ²Π°ΡΡ ΡΠ°Π·ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΠΏΠ΅ΡΠ΅ΠΌΠ΅Π½Π½ΡΡ Π² ΡΠ΅Π³ΠΈΡΡΡΠ°Ρ Π½Π° Π°Π½Π°Π»ΠΈΠ·Π΅ ΠΈΡΡ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ΄Π°, ΠΈΠ³Π½ΠΎΡΠΈΡΡΡ ΠΊΠ»ΡΡΠ΅Π²ΠΎΠ΅ ΡΠ»ΠΎΠ²ΠΎ
register
2.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;
ΠΡΠ³ΡΠΌΠ΅Π½ΡΡ
argc
argv
main()
optstring