scanf 함수

int scanf(const char *format,…); 표준 입력 파일 스트림의 버퍼에서 포멧을 지정하여 읽어오는 함수

입력 매개 변수 리스트

foramt 입력 포멧 문자열

반환 값

입력 포멧에 맞게 변환한 개수

scanf 함수로 문자열을 입력받을 때 버퍼의 크기를 전달하지 않습니다. gets 함수처럼 최종 사용자가 버퍼 크기보다 많은 문자를 입력하면 버퍼 오버플로우가 발생합니다. C11에서는 scanf 대신 버퍼 오버플로우 문제를 개선한 scanf_s 함수를 제공하고 있습니다.

scanf 함수에 입력 포멧에 포멧 사양자가 아닌 문자도 최종 사용자는 입력해야 합니다. 만약 입력하지 않으면 이전까지 처리하고 이후는 처리하지 않습니다. 그리고 입력하면 해당 문제는 변환 과정에서 필터링합니다. 예를 들어 scanf(“%d.%d.%d.%d”,&a, &b, &c, &d); 처럼 호출할 때 최종 사용자가 12.34.56.78을 입력하면 a는 12, b는 34, c는 56, d는 78을 설정하고 4를 반환합니다.

그리고 scanf 함수로 문자열을 입력받을 때 공백이나 탭, 엔터가 오기 전까지 문자를 문자열로 변환합니다. 따라서 공백을 포함하는 문자열을 입력받을 때는 gets나 get_s 등의 함수를 사용합니다.

사용 예

//C언어 표준 라이브러리 함수 가이드
//int scanf(const char *format,...); 표준 입력 파일 스트림의 버퍼에서 포멧을 지정하여 읽어오는 함수
//IPv4 주소를 입력받아 출력

#pragma warning(disable:4996)
#include <stdio.h>

#define AVAIL(x) ((x>=0)&&(x<=255)) //유효한 수인지 판별하는 매크로
//IPv4주소로 유효한지 판별하는 매크로
#define AVAIL_IPv4(a,b,c,d) (AVAIL(a)&&AVAIL(b)&&AVAIL(c)&&AVAIL(d))
int main(void)
{
    int a, b, c, d;
    int result;

    //IPv4 주소 입력
    printf("IPv4 주소 입력(xxx.xxx.xxx.xxx) : ");
    result = scanf("%d.%d.%d.%d", &a, &b, &c, &d);


    if (result < 4)//변환 개수가 4보다 작을 때
    {
        printf("포멧에 맞게 입력하지 않았습니다.\n");
    }
    else
    {
        if (AVAIL_IPv4(a, b, c, d))//유효한 IPv4 주소일 때
        {
            printf("입력한 IPv4 주소는 %d.%d.%d.%d \n", a, b, c, d);
        }
        else
        {
            printf("유효한 IPv4 주소가 아닙니다.\n");
        }
    }
    return 0;
}

출력

IPv4 주소 입력(xxx.xxx.xxx.xxx) : 192.168.34.50
입력한 IPv4 주소는 192.168.34.50