C의 argc와 argv

Jinku Hu 2023년10월12일
  1. int argc, char *argv[]표기법을 사용하여 C에서 명령 줄 인수 가져 오기
  2. memccpy를 사용하여 C에서 명령 줄 인수 연결
C의 argc와 argv

이 기사에서는 C에서 명령 줄 인수argcargv를 사용하는 몇 가지 방법을 설명합니다.

int argc, char *argv[]표기법을 사용하여 C에서 명령 줄 인수 가져 오기

프로그램이 실행되면 사용자는 명령 줄 인수라고하는 공백으로 구분 된 문자열을 지정할 수 있습니다. 이러한 인수는 프로그램의main함수에서 사용할 수 있으며 개별 널 종료 문자열로 구문 분석 할 수 있습니다. 인수에 액세스하려면 매개 변수를int argc, char *argv[]로 포함해야합니다. 이는 전달 된 인수 수와 명령 줄 인수를 포함하는 문자열 배열을 나타냅니다. 배열의 첫 번째 문자열은 규칙에 따라 프로그램 이름 자체입니다. 따라서 인수argc의 수에는 프로그램 이름이 포함됩니다. 다음 예제에서 설명하는 것처럼argv배열을 통해 간단한 반복으로 모든 명령 줄 인수를 인쇄 할 수 있습니다.

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

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

  exit(EXIT_SUCCESS);
}

샘플 명령 :

./program hello there

출력:

argv[0] = ./program
argv[1] = hello
argv[2] = there

null로 끝나는 문자열의 argv배열은 마지막 인수를 나타내는 NULL포인터로 종료됩니다. 따라서이 기능을 사용하여argv 포인터 자체를 평가하고NULL이 될 때까지 증가시킴으로써 인자 인쇄 루프를 구현할 수 있습니다. 나중에 프로그램에서 필요할 경우를 대비하여 배열의 원래 주소를 보존하기 위해 루프에 대해 별도의char*포인터를 만드는 것이 좋습니다. 다음 샘플 코드는 이전 예제와 동일한 명령이 실행된다고 가정합니다.

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

int main(int argc, char *argv[]) {
  char **ptr;
  for (ptr = argv; *ptr != NULL; ptr++) printf("%s\n", *ptr);

  exit(EXIT_SUCCESS);
}

출력:

./program
hello
there

memccpy를 사용하여 C에서 명령 줄 인수 연결

memccpy함수는argv배열 문자열을 연결하는 데 사용되는 표준 라이브러리 문자열 유틸리티의 일부입니다. memccpy는 복사를 중지 할 때 문자를 지정하기 위해 네 번째 인수를 사용한다는 점을 제외하면memcpy와 유사합니다. 후자의 기능을 이용하여 문자열 내용 만 복사하고 null 바이트를 종료합니다. 다음 예에서는 사용자가 정확히 두 개의 인수 (프로그램 이름 제외)를 제공했는지 확인한 다음 프로그램 실행을 계속합니다. 결과적으로 두 개의memccpy호출을 연결하여 두 인수를 모두 복사하고 연결된 문자열을stdout에 인쇄합니다.

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

int main(int argc, char *argv[]) {
  if (argc != 3) {
    printf("Usage: ./program string1 string2\n");
    exit(EXIT_FAILURE);
  }

  size_t size = strlen(argv[1]) + strlen(argv[2]);
  char buf[size];

  memccpy(memccpy(buf, argv[1], '\0', size) - 1, argv[2], '\0', size);
  printf("%s\n", buf);

  exit(EXIT_SUCCESS);
}

출력:

hellothere
작가: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn Facebook

관련 문장 - C Process