개요

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

+ Recent posts