일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- C# delegate
- Houdini
- jupyter lab
- HTML
- c# 윈폼
- gitlab
- Data Structure
- c언어
- 다트 언어
- 구조체
- Unity
- C언어 포인터
- Algorithm
- jupyter
- github
- c# 추상 클래스
- 플러터
- Flutter
- c# winform
- 유니티
- docker
- C++
- 도커
- Python
- vim
- 깃
- dart 언어
- 포인터
- git
- c#
Archives
- Today
- Total
nomad-programmer
[Programming/C] printf() 함수와 비슷한 가변인자 함수 만들기 본문
가변 인자가 특정 자료형이 아닌 여러 자료형이 전달된다면 첫 번째 인자에 인자의 개수와 자료형의 정보까지도 전달해야 한다. 그래서 printf()와 같은 함수는 첫 번째 인자를 문자열로 만들고 '%c, %d, %s' 등을 사용하여 자료형과 인자의 개수를 전달한다.
'%c' 이면 문자를 인자로 전달하고, '%d' 이면 정수를 인자로 전달하고, '%s' 이면 문자열의 시작 주소를 인자로 전달한다.
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
void MiniPrintf(char *fmt, ...){
int i = 0;
va_list ap;
va_start(ap, fmt);
while(fmt[i] != '\0'){
if(fmt[i] != '%'){
putchar(fmt[i]);
}
else{
switch(fmt[++i]){
case 'c':
printf("%c", va_arg(ap, char));
break;
case 'd':
printf("%d", va_arg(ap, int));
break;
case 's':
printf("%s", va_arg(ap, char*));
break;
default:
puts("wrong type...");
}
}
i++;
}
va_end(ap);
}
int main(int argc, const char * argv[]) {
char c = 'a';
char* str = "abc";
int a = 10, b = 20;
MiniPrintf("%d + %d = %d\n", a, b, a + b);
MiniPrintf("%s = abc\n", str);
MiniPrintf("%c%c%c\n", c, c, c);
return 0;
}
/* 결과
10 + 20 = 30
abc = abc
aaa
*/
fmt는 문자열의 시작 주소를 저장하고 ap는 두 번째 인자의 주소를 저장하여 MiniPrintf() 함수를 시작한다. fmt 문자열 중 '%' 문자가 나오면 다음 문자가 'c', 'd', 's' 인지를 판단하여 'c' 문자이면 ap 주소를 이용하여 문자를 읽고 'd' 문자이면 ap 주소를 이용하여 정수를 읽고 's' 문자이면 문자열의 주소를 읽는다.
'Programming > C' 카테고리의 다른 글
[Programming/C] 매크로 함수와 shift bit 연산을 이용한 정수 결합 (0) | 2021.01.20 |
---|---|
[Programming/C] XOR(^)를 이용한 데이터 교환 (0) | 2021.01.20 |
[Programming/C] 여러 가지 포인터의 비교 (0) | 2021.01.16 |
[Programming/C] 구조체의 크기를 예측하지 말라 (0) | 2021.01.16 |
[Programming/C] 문자 코드 (0) | 2021.01.15 |
Comments