C 언어를 하다 보면, 가끔 C 언어를 하다 보면 아래와 같이 main 함수에서 parameter를 사용해야 할 때가 있다.
int main (int argc, char argv[]) ...
이번 글에서는 'argc'와 'argv [ ]'에 대해 소개하고 어떻게 쓰일 수 있는지 적어보려 한다.
먼저 'argc'는 메인 함수에서 받는 정보의 갯수를 의미한다. 즉 실행할 때, 입력하는 데이터의 수를 의미하는데 array에 저장이 된다. 0부터 차례대로 저장이 되며, 0에는 코드명이 저장이 된다.
./ array 1 2 3 4 5 6
예를 들어 array라는 코드를 실행한다면 'argc [0]' 에는 파일명인 './array'가, 그다음부터 1, 2, 3, 4, 5, 6이 차례대로 저장이 된다. 따라서 'argc'는 총 7개 (0 ~ 6) 의 index로 이루어진다.
다음으로 'argv [ ]'는 main 함수에 실제로 전달되는 데이터를 의미하고, data type은 'char' 형이다. 위 예시 코드를 이용해 코드로 나타내면 다음과 같다.
argv[0] = "./array"
argv[1] = "1"
argv[2] = "2"
argv[3] = "3"
argv[4] = "4"
argv[5] = "5"
argv[6] = "6"
argv[7] = "7"
그렇다면 어떻게 사용할 수 있을까?
C언어를 연습하면서 다음과 같은 문제가 있었다.
Write a program that takes up to 10 integers as command line parameters.
These parameters are converted to integer types into an array of int named array.
Then, the program sorts the array by increasing value and prints the resulat as follows:
./array 5 4 6 2 1 3
1 2 3 4 5 6
./array 5 5 120
5 5 120
과제는 최대 10개의 숫자를 command line에서 받고, 이 숫자들을 integer로 변환하여 작은 수부터 한 줄로 출력한다.
'argc'와 'argv [ ]'는 두 가지 목적으로 사용이 된다.
첫 번째, command line에서 받은 수가 10개가 넘어가는지 검사할 때 사용을 한다.
두 번째, 작은 수 부터 정렬할 때 사용한다.
먼저 첫 번째 목적을 위한 코드를 작성해 보겠다.
# include <stdio.h>
# include <stdlib.h>
int main (int argc, char argv []) {
if (argc > 11) {
printf("Error: Too many input parameters. Maximum is 10 integers.\n");
return 1;
}
'argc > 11'인 이유는 위에서 언급했듯이, 'argc [0]'에는 코드명이 저장되기 때문에 +1이 되어야 한다. 이제 이 코드는 10개가 넘어가는 수를 command line에 입력을 하게 되면 에러문구를 출력할 것이다.
다음으로 두 번째 목적을 위한 코드를 작성해 보자.
작은 수부터 정렬을 하기 위해서는 C Library에서 한 함수를 불러와야 한다. 바로 'qsort ( )'이다.
void qsort(void *base, size_t nitems, size_t size, int (*compar)(const void *, const void*))
위를 보면, qsort 함수의 parameter로 'base', 'nitems', 'size', 그리고 compar가 있다. 각 parameter의 설명은 다음과 같다.
- 'base': 정렬되어야 하는 array의 첫 번째 element를 가리키는 pointer
- 'nitems': 위 array의 크기
- 'size': 위 array의 element의 size (sizeof 'Data Type')
- 'compar': 두 elements를 비교하는 함수
참고로 이 함수는 return value가 없다.
본격적으로 'qsort' 함수를 사용하기 전에, 내가 작성해야 하는 코드에 맞는 'compar' 함수를 작성해 보겠다.
int compare(const void *a, const void *b) {
return ( *(int*)a - *(int*)b );
}
Array 안 a, b 두 수를 뽑아서 비교를 할 텐데, 뽑은 두 수를 빼서 양수인지 음수인지를 보기 위해 return value를 위와 같이 작성을 했다.
그렇다면 내가 필요한 상황에 맞게 'qsort'를 작성해 보겠다.
qsort(array, array_size, sizeof(int), compare);
이렇게 작성을 하고 나면 작은 수부터 이제 정렬을 하고 array에 차례대로 저장이 되어있다.
그렇다면 이제 완성된 코드를 보자.
#include <stdio.h>
#include <stdlib.h>
// Function to compare two elements for qsort
int compare(const void *a, const void *b) {
return ( *(int*)a - *(int*)b );
}
int main(int argc, char *argv[]) {
if (argc > 11) {
printf("Error: Too many input parameters. Maximum is 10 integers.\n");
return 1;
}
int array[10];
int array_size = argc - 1; // Subtracting 1 to exclude the program name from the arguments.
// Convert command line arguments to integers and populate the array.
for (int i = 0; i < array_size; i++) {
array[i] = atoi(argv[i + 1]);
}
// Sort the array in ascending order.
qsort(array, array_size, sizeof(int), compare);
// Print the sorted array.
for (int i = 0; i < array_size; i++) {
printf("%d ", array[i]);
}
printf("\n");
return 0;
}
여기까지입니다. 앞으로도 코딩 연습을 하면서 필요하겠다 싶은 내용들로 하나씩 적어보려 합니다. 감사합니다. 좋은 하루 보내세요. 아래는 제 GitHub 링크입니다. 구경 오세요!
'Computer Programming > Cpp, Python' 카테고리의 다른 글
C 언어: Time Function (8) | 2023.06.23 |
---|