programing

명령줄 매개 변수 읽기

padding 2023. 10. 5. 21:15
반응형

명령줄 매개 변수 읽기

저는 파이(π)를 연산하기 위한 작은 프로그램을 일체형으로 만들었습니다.이제 응용 프로그램을 시작할 때 추가 매개 변수로 제공되는 적분을 계산하기 위해 확장하는 방법에 대한 질문에 직면해 있습니다.프로그램에서 이러한 파라미터를 어떻게 처리해야 합니까?

주 함수를 쓸 때 일반적으로 두 가지 정의 중 하나가 나타납니다.

  • int main(void)
  • int main(int argc, char **argv)

두 번째 양식을 사용하면 프로그램에 전달된 명령줄 인수와 지정된 인수의 수에 액세스할 수 있습니다(인수는 공백으로 구분됨).

의 주장은.main다음과 같습니다.

  • int argc- 프로그램이 실행될 때 전달된 인수 수입니다.그것은 적어도1.
  • char **argv- 이것은 지시사항입니다.char *. 또는 다음과 같을 수도 있습니다.char *argv[], 그 말은 '배열'이란 뜻입니다.char *'. 이것은 C 스타일의 문자열 포인터의 배열입니다.

기본 예시

예를 들어, C 프로그램에 전달된 인수를 출력하기 위해 이렇게 할 수 있습니다.

#include <stdio.h>

int main(int argc, char **argv)
{
    for (int i = 0; i < argc; ++i)
    {
        printf("argv[%d]: %s\n", i, argv[i]);
    }
}

GCC 4.5를 사용하여 전화한 파일을 컴파일하고 있습니다.args.c. 기본값을 컴파일하고 구축합니다.a.out실행 가능한

[birryree@lilun c_code]$ gcc -std=c99 args.c

이제 실행...

[birryree@lilun c_code]$ ./a.out hello there
argv[0]: ./a.out
argv[1]: hello
argv[2]: there

그래서 당신은 그것을 볼 수 있습니다.argv,argv[0]실행한 프로그램의 이름입니다(표준 정의 동작은 아니지만 일반적입니다).당신의 주장은 시작합니다.argv[1]그리고 그 이상.

그래서 기본적으로, 만약 당신이 단 하나의 파라미터를 원한다면, 당신은 이렇게 말할 수 있습니다.

./myprogram integral


간단한 케이스

그리고 당신은 확인할 수 있습니다.argv[1]이었다integral, 아마strcmp("integral", argv[1]) == 0.

그래서 당신 코드에...

#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{
    if (argc < 2) // no arguments were passed
    {
        // do something
    }

    if (strcmp("integral", argv[1]) == 0)
    {
        runIntegral(...); //or something
    }
    else
    {
        // do something else.
    }
}

명령줄 구문 분석 기능 향상

물론, 이 모든 것은 매우 초보적인 것이었고, 프로그램이 복잡해짐에 따라 보다 고급화된 명령줄 처리를 원할 것입니다.이를 위해서는 GNU와 같은 라이브러리를 사용할 수 있습니다.

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv) {
  int i, parameter = 0;
  if (argc >= 2) {
    /* there is 1 parameter (or more) in the command line used */
    /* argv[0] may point to the program name */
    /* argv[1] points to the 1st parameter */
    /* argv[argc] is NULL */
    parameter = atoi(argv[1]); /* better to use strtol */
    if (parameter > 0) {
      for (i = 0; i < parameter; i++) printf("%d ", i);
    } else {
      fprintf(stderr, "Please use a positive integer.\n");
    }
  }
  return 0;
}

위의 답변에서 설명한 대로 명령행 인수를 원시적인 방법으로 파싱하는 것은 처리해야 할 매개 변수의 수가 너무 많지 않은 한 합리적입니다.

명령행 인수 처리를 위해 산업 강도 라이브러리를 사용할 것을 강력히 제안합니다.

이것은 당신의 코드를 더 전문적으로 만들어 줄 것입니다.

이러한 C++용 라이브러리는 아래 웹사이트에서 이용 가능합니다.저는 많은 프로젝트에서 이 라이브러리를 사용해 보았는데, 따라서 명령 줄 인수 구문 분석에 가장 쉽지만 유용한 라이브러리 중 하나라고 자신 있게 말할 수 있습니다.또한 단순한 템플릿 라이브러리이기 때문에 프로젝트로 가져오기가 더 쉽습니다.http://tclap.sourceforge.net/

C에서도 비슷한 라이브러리를 이용할 수 있습니다.http://argtable.sourceforge.net/

명령줄 인수를 가져올 수 있는 C 표준 내장 라이브러리도 있습니다. getopt

위키피디아C/Unix인수 구문 분석 도우미에서 확인할 수 있습니다.

언급URL : https://stackoverflow.com/questions/5157337/reading-command-line-parameters

반응형