본문 바로가기
Study/c,c++

Scanf의 형식지정자에 대하여

by 개발새-발 2021. 2. 26.
반응형

scanf는 c언어를 배울 때 처음 배우는 입력 함수이다.

 

정수 하나를 입력받는다고 하자.

int i;
scanf("%d",&i);

 

위와 같을 꼴로 int 정수 하나를 입력받을 것이다.

 

scanf에서 우리가 첫 파라메터로 입력한 값을 형식지정자라고 한다. 이 값을 잘 조정함으로 우리는 다양한 입력을 여러가지 방법으로 받을 수 있다.

 

예를들어 123456789 라는 입력이 있을 때 이 입력을 9자리의 정수가 아닌 3자리의 정수 3개로 받을 수 있다.

#include <cstdio>

int main(void){
    int a,b,c;
    scanf("%3d%3d%3d",&a,&b,&c);
    printf("a:%d, b: %d, c: %d\n",a,b,c);
}

이때 출력은 다음과 같다.

> a:123, b: 456, c: 789

 

형식지정자의 형태는 %[*][width][length]specifier 의 꼴이다.

 

* 사용

* 를 사용하면 입력을 무시할 수 있다.

#include <cstdio>

int main(void){
    int a;
    scanf("%*d %d",&a);
    printf("a:%d\n",a);
}

이 프로그램에 1234 5678 이란 입력을 주면 1234 는 무시되어 a는 5678이 된다.

 

무시할 글자의 길이를 지정해주면 공백으로 구분되어있지 않은 입력도 일부분만 받을 수 있다.

#include <cstdio>

int main(void){
    int a;
    scanf("%*3d%d",&a);
    printf("a:%d\n",a);
}

이프로그램에 123456을 입력으로 주면 a는 456이 된다.

여기서 "%*3d%d"를 보자. %*3d로 앞3자리를 무시하고 뒤의 %d로 나머지 입력들을 a에 저장하게 된다.

 

[ ] 사용

[]내부에 있는 문자만 입력으로 처리한다는 뜻이다. 범위를 지정하는것도 가능해서 "%[ A-Za-z0-9]" 와 같이 쓰면 스페이스바, 알파벳 대소문자와 숫자를 처리가능하다.

 

[^ ] 사용

[]와 반대이다. []내부에 있지 않은 문자만 입력으로 처리한다. "%[^\n]"과 같이 쓰면 스페이스바를 입력하기 전 모든 글자를 입력받을 수 있다.

#include <cstdio>

int main(void){
    char* s[30]={0,};
    scanf("%[^\n]",s);
    printf("string s is : %s",s);
}

이 프로그램에 hello world! 123를 입력하면 string s is : hello world! 123 를 출력한다.
스페이스바를 포함한 입력 모두가 s에 저장된 모습을 볼 수 있다.

 

더 자세한 내용은 www.cplusplus.com/reference/cstdio/scanf/ 여기서.

 

반응형

댓글