개요
C에서 사용되는 입력과 출력의 명령어와 출력 명령어 만들어보기
명령어
#include <stdio.h> 를 사용하여 입출력 라이브러리(Library)*를 사용한다.
*라이브러리 ( Library ) :
입력
scanf("%d %d", 주소값, 주소값)
scanf는 첫번째 인자의 %(타입)을 통하여 원하는 입력 받을 값들의 타입을 결정할 수 있다.
다음 가변 인자들을 통하여 입력받을 객체의 메모리주소값 (&식별자) 을 입력한다.
출력
printf("출력할 값은 : %d %d", 식별자, 식별자)
printf는 %(타입)을 통하여 출력 값들의 타입을 결정할 수 있다.
첫번째 인자를 통해 출력할 내용과 출력 받을 변수값의 타입을 입력할 수 있다.
다음 가변 인자들을 통하여 출력할 객체들의 변수명(식별자)를 입력하는 것으로 출력할 수 있다.
printf() 만들기
배운 기능을 활용하여 정수, 문자, 문자열을 출력하는 함수를 만들어 보자
#include <stdio.h>
#include <stdarg.h>
void myprintf(const char* format, ...); // 함수 프로토타입
int main(void)
{
myprintf("Hello My Printf : %d, %c, %s ", -14, 'A', "Hello World!"); //
}
// 최대 자릿수의 수를 반환하고 삭제하는 함수
int FindingTop(int* num, int num2)
{
int count = 1;
while (num2 > 10)
{
count *= 10; // 가장 상위 자릿수 찾기
num2 /= 10; // 10으로 나눠 1의 자릿수 부터 지워감
}
*num %= count; // 가장 상위 자릿수를 지움
return num2; // 가장 상위 자릿수의 값을 반환
}
void myprintf(const char* format, ...)
{
va_list arg; // char* arg
va_start(arg, format);
while (*format != NULL) // format이 끝날 때 까지 돌아요
{
if (*format == '%')
{
format++; // char* 이니 1바이트 포인터 연산이 된다.
int num = 0;
char ch = NULL;
char* str = NULL;
switch (*format) // %의 다음 문자를 switch문을 통해 판단
{
case 'd': // 정수형 타입 출력
num = va_arg(arg, int);
// 양수인 경우
// 0000 0000 0000 0000 0000 0000 0000 1110 // +14
// 1000 0000 0000 0000 0000 0000 0000 0000 // 1 << 31
// 0000 0000 0000 0000 0000 0000 0000 0000 // & 결과
// = 0 (False)
// 음수인 경우
// 1111 1111 1111 1111 1111 1111 1111 0010 // -14
// 1000 0000 0000 0000 0000 0000 0000 0000 // 1 << 31
// 1000 0000 0000 0000 0000 0000 0000 0000 // & 결과
// != 0 (True)
const int isNegative = num & (1 << 31);
if (isNegative) // 음수인 경우 True
{
putchar('-');
num = ~num;
num++;
}
do
{
putchar(FindingTop(&num, num) + '0');
} while (num != 0);
break;
case 'c': // 문자 타입 출력
ch = va_arg(arg, char);
putchar(ch);
break;
case 's': // 문자열 타입 출력
str = va_arg(arg, char*);
while (*str != NULL)
{
putchar(*str);
str++;
}
break;
default: // %
break;
}
}
else
{
putchar(*format);
}
format++;
}
va_end(arg);
}
728x90
'Program > C (C++,C#)' 카테고리의 다른 글
[C] 문자열 ( String ) (0) | 2022.05.29 |
---|---|
[C] 포인터 ( Pointer ) (0) | 2022.05.29 |
[C] 변환 ( Conversion ) (0) | 2022.05.08 |
[C] 객체 ( Object ) (0) | 2022.05.07 |
[C] 식별자 ( ID / Identifier ) (0) | 2022.05.07 |