C Language
명령 줄 인수
수색…
통사론
- int main (int argc, char * argv [])
매개 변수
매개 변수 | 세부 |
---|---|
argc | 인수 카운트 - 프로그램 이름 자체뿐만 아니라 명령 행에서 프로그램에 주어진 공백으로 구분 된 인수의 수로 초기화됩니다. |
argv | argument vector - 명령 행에 주어진 인수 (및 프로그램 이름)를 포함하는 char -pointers (문자열)의 배열로 초기화됩니다. |
비고
'호스트 된 환경'(정상적인 유형 - '독립형 환경'과 반대되는)에서 실행되는 AC 프로그램에는 main
기능이 있어야합니다. 전통적으로 다음과 같이 정의됩니다.
int main(int argc, char *argv[])
argv
는 또한 char **argv
로 정의 될 수 있으며 매우 자주 정의됩니다. 행동은 동일합니다. 또한 매개 변수 이름은 함수 내의 로컬 변수이기 때문에 변경할 수 있지만 argc
및 argv
는 일반적이므로 이러한 이름을 사용해야합니다.
코드가 인수를 사용하지 않는 main
함수의 경우 int main(void)
.
두 매개 변수는 프로그램 시작시 초기화됩니다.
-
argc
는 프로그램 이름 자체뿐만 아니라 명령 행에서 프로그램에 주어진 공백으로 구분 된 인수의 수로 초기화됩니다. -
argv
는 명령 행에 주어진 인수 (및 프로그램 이름)를 포함하는char
-pointers (문자열)의 배열입니다. - 일부 시스템에서는 "쉘에서"명령 행 인수를 확장하지만 다른 시스템에서는 그렇지 않습니다. Unix에서 사용자가
myprogram *.txt
하면 프로그램은 텍스트 파일의 목록을받습니다. Windows에서는 "*.txt
"문자열을 수신합니다.
참고 : argv
사용하기 전에 argc
의 값을 확인해야합니다. 이론적으로 argc
는 0
이 될 수 있고 argc
가 0이면 인수가없고 argv[0]
( argv[argc]
와 동일)는 널 포인터입니다. 이 문제에 부딪혔다면 호스팅 된 환경에서 비정상적인 시스템이 될 것입니다. 비슷하게 프로그램 이름에 대한 정보가 없기 때문에 아주 드물지만 가능합니다. 이 경우 argv[0][0] == '\0'
프로그램 이름이 비어있을 수 있습니다.
다음과 같이 프로그램을 시작한다고 가정 해보십시오.
./some_program abba banana mamajam
그런 다음 argc
는 4
와 같으며 명령 줄 인수는 다음과 같습니다.
- 호스트 환경에서 프로그램 이름을 사용할 수있는 경우
argv[0]
은"./some_program"
(프로그램 이름)을 가리 킵니다. 그렇지 않으면 빈 문자열""
됩니다. -
argv[1]
은"abba"
가리 킵니다. -
argv[2]
가"banana"
, -
argv[3]
은"mamajam"
, -
argv[4]
는NULL
값을 포함합니다.
C 및 C ++에서 main()
반환해야하는 내용을 참조하여 표준에서 완전한 인용 부호를 찾으십시오.
명령 행 인수 인쇄하기
인수를받은 후 다음과 같이 인쇄 할 수 있습니다.
int main(int argc, char **argv)
{
for (int i = 1; i < argc; i++)
{
printf("Argument %d: [%s]\n", i, argv[i]);
}
}
노트
-
argv
매개 변수는char *argv[]
로 정의 할 수도 있습니다. -
argv[0]
에는 프로그램 이름 자체 가 포함될 수 있습니다 (프로그램 실행 방법에 따라 다름). 첫 번째 "실제"명령 행 인수는argv[1]
있으며, 이것이 루프 변수i
가 1로 초기화되는 이유입니다. - print 문에서
argv[i]
대신*(argv + i)
를 사용할 수 있습니다. 동일한 결과를 얻지 만 좀 더 자세한 정보입니다. - 인수 값 주위의 대괄호는 시작과 끝을 식별하는 데 도움이됩니다. 인수에 후미 공백, 개행 문자, 캐리지 리턴 또는 다른 괴짜 문자가있는 경우이 값은 매우 중요합니다. 이 프로그램의 일부 변형은 인수 목록에 실제로 포함되어있는 것을 이해해야하는 곳에서 쉘 스크립트를 디버깅하는 데 유용한 도구입니다 (거의 동일한 간단한 쉘 대안이 있지만).
인수를 프로그램에 인쇄하고 정수 값으로 변환하십시오.
다음 코드는 프로그램에 인수를 인쇄하고 코드는 각 인수를 숫자로 변환하려고 시도합니다 ( long
).
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#include <limits.h>
int main(int argc, char* argv[]) {
for (int i = 1; i < argc; i++) {
printf("Argument %d is: %s\n", i, argv[i]);
errno = 0;
char *p;
long argument_numValue = strtol(argv[i], &p, 10);
if (p == argv[i]) {
fprintf(stderr, "Argument %d is not a number.\n", i);
}
else if ((argument_numValue == LONG_MIN || argument_numValue == LONG_MAX) && errno == ERANGE) {
fprintf(stderr, "Argument %d is out of range.\n", i);
}
else {
printf("Argument %d is a number, and the value is: %ld\n",
i, argument_numValue);
}
}
return 0;
}
참고 문헌 :
GNU getopt 도구 사용하기
응용 프로그램의 명령 행 옵션은 C 언어의 명령 행 인수와 다르게 처리되지 않습니다. 그것들은 리눅스 나 유닉스 환경에서 전통적으로 대시 ( -
)로 시작하는 논증 일뿐입니다.
Linux 또는 Unix 환경에서 glibc를 사용하면 getopt 도구 를 사용하여 나머지 인수에서 명령 행 옵션을 쉽게 정의, 유효성 검증 및 구문 분석 할 수 있습니다.
이 도구들은 여러분의 옵션이 GNU 코딩 표준 에 따라 포맷 될 것을 기대하는데, 이는 POSIX가 명령 행 옵션의 형식에 대해 지정한 것을 확장 한 것입니다.
아래 예제는 GNU getopt 도구로 명령 행 옵션을 처리하는 방법을 보여줍니다.
#include <stdio.h>
#include <getopt.h>
#include <string.h>
/* print a description of all supported options */
void usage (FILE *fp, const char *path)
{
/* take only the last portion of the path */
const char *basename = strrchr(path, '/');
basename = basename ? basename + 1 : path;
fprintf (fp, "usage: %s [OPTION]\n", basename);
fprintf (fp, " -h, --help\t\t"
"Print this help and exit.\n");
fprintf (fp, " -f, --file[=FILENAME]\t"
"Write all output to a file (defaults to out.txt).\n");
fprintf (fp, " -m, --msg=STRING\t"
"Output a particular message rather than 'Hello world'.\n");
}
/* parse command-line options and print message */
int main(int argc, char *argv[])
{
/* for code brevity this example just uses fixed buffer sizes for strings */
char filename[256] = { 0 };
char message[256] = "Hello world";
FILE *fp;
int help_flag = 0;
int opt;
/* table of all supported options in their long form.
* fields: name, has_arg, flag, val
* `has_arg` specifies whether the associated long-form option can (or, in
* some cases, must) have an argument. the valid values for `has_arg` are
* `no_argument`, `optional_argument`, and `required_argument`.
* if `flag` points to a variable, then the variable will be given a value
* of `val` when the associated long-form option is present at the command
* line.
* if `flag` is NULL, then `val` is returned by `getopt_long` (see below)
* when the associated long-form option is found amongst the command-line
* arguments.
*/
struct option longopts[] = {
{ "help", no_argument, &help_flag, 1 },
{ "file", optional_argument, NULL, 'f' },
{ "msg", required_argument, NULL, 'm' },
{ 0 }
};
/* infinite loop, to be broken when we are done parsing options */
while (1) {
/* getopt_long supports GNU-style full-word "long" options in addition
* to the single-character "short" options which are supported by
* getopt.
* the third argument is a collection of supported short-form options.
* these do not necessarily have to correlate to the long-form options.
* one colon after an option indicates that it has an argument, two
* indicates that the argument is optional. order is unimportant.
*/
opt = getopt_long (argc, argv, "hf::m:", longopts, 0);
if (opt == -1) {
/* a return value of -1 indicates that there are no more options */
break;
}
switch (opt) {
case 'h':
/* the help_flag and value are specified in the longopts table,
* which means that when the --help option is specified (in its long
* form), the help_flag variable will be automatically set.
* however, the parser for short-form options does not support the
* automatic setting of flags, so we still need this code to set the
* help_flag manually when the -h option is specified.
*/
help_flag = 1;
break;
case 'f':
/* optarg is a global variable in getopt.h. it contains the argument
* for this option. it is null if there was no argument.
*/
printf ("outarg: '%s'\n", optarg);
strncpy (filename, optarg ? optarg : "out.txt", sizeof (filename));
/* strncpy does not fully guarantee null-termination */
filename[sizeof (filename) - 1] = '\0';
break;
case 'm':
/* since the argument for this option is required, getopt guarantees
* that aptarg is non-null.
*/
strncpy (message, optarg, sizeof (message));
message[sizeof (message) - 1] = '\0';
break;
case '?':
/* a return value of '?' indicates that an option was malformed.
* this could mean that an unrecognized option was given, or that an
* option which requires an argument did not include an argument.
*/
usage (stderr, argv[0]);
return 1;
default:
break;
}
}
if (help_flag) {
usage (stdout, argv[0]);
return 0;
}
if (filename[0]) {
fp = fopen (filename, "w");
} else {
fp = stdout;
}
if (!fp) {
fprintf(stderr, "Failed to open file.\n");
return 1;
}
fprintf (fp, "%s\n", message);
fclose (fp);
return 0;
}
gcc
로 컴파일 할 수 있습니다 :
gcc example.c -o example
세 가지 명령 행 옵션 ( --help
, --file
및 --msg
)을 지원합니다. 모두 "짧은 형식"도 있습니다 ( -h
, -f
및 -m
). "file"및 "msg"옵션은 모두 인수를 허용합니다. "msg"옵션을 지정하면 인수가 필요합니다.
옵션의 인수는 다음과 같이 형식화됩니다.
-
--option=value
(긴 형식 옵션의 경우) -
-ovalue
또는-o"value"
(짧은 형식 옵션의 경우)