C의 argc와 argv
이 기사에서는 C에서 명령 줄 인수argc
및argv
를 사용하는 몇 가지 방법을 설명합니다.
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
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