티스토리 뷰

<stdarg.h> 라이브러리는

함수가 인자를

갯수 형태에 상관없이 받을수있도록하는 기능을 제공합니다


이기능을 이용해서 함수가 입력받은 인자들중에서 최대값을 리턴하도록 작성해보겠습니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
int32_t _wMax(const char16_t* _lpszFormat, ...)
{
    //함수 초기화
    va_list args;
    va_start(args, _lpszFormat);
 
    const char16_t* lpszFormat = _lpszFormat;
    int32_t n = 0;
    const char16_t* lpszEnd;
    n = wcstol(lpszFormat, &lpszEnd, 0);
    //함수 초기화 끝
 
    //함수 wcstol 은 stdlib.h 에 선언되 있습니다.
    //문자를 숫자로 변환해줍니다.
 
    //예외 처리
    if (n == 0)
        return 0;
    else if (n == 1)
        return va_arg(args, int32_t);
 
    //큰값 작은값 변수 선언
    int32_t max = va_arg(args, int32_t);
    int32_t min = 0;
    for (int32_t i = 1; i < n; ++i)
    {
          min = va_arg(args, int32_t);
          if (max < min) //만약 작은수가 큰수보다 크면     
              max = min; //작은수는 큰수가 됩니다              
    }
    
    va_end(args);    //스택정리
    return max;
}
cs


코드는 이렇습니다


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int main() {
 
    //로케일 설정 유니코드 함수들은 이함수에 지역값에따라 영향을 받습니다.
    //""은 현재 컴퓨터에 지정된 언어값이 설정되고
    //"Korean" 이라고하시면 한국이 설정됩니다.
    setlocale(LC_ALL, "");    
 
    srand((uint32_t)time(NULL));    //랜덤시드 돌려주고
 
    int32_t b[10= { 0 };        //랜덤한 숫자배열 생성
    for (int32_t i = 0; i < 10++i)
    {
        b[i] = rand();        //배열을 채워주고
        wprintf(u"%d. 값 :: %d\n", i + 1, b[i]);        //배열 출력
    }
 
    int32_t max = _wMax(u"6", b[0], b[1], b[2], b[3], b[4], b[5]);    //함수에 하나하나 인자들을 넣어준뒤
    wprintf(u"최대값 :: %d\n", max);    //결과 출력
 
    return 0;
}
cs


그런다음 결과를 보면


잘구해졌습니다.

걍 for문으로 돌렸으면 더 단순했을까요 하하.

C 에서는 Variable Arguments 라고 하고

C++  에서는 Variadic Template 이라고 합니다

C 에서는 타입체크가 안되서 약간 뭔가 부족한 느낌이 들지만

이기능은 C++에서 프로그래머를 무시무시한 괴물로 만들어 줍니다.

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함