scanf()

정의

  • 지정된 양식으로 값을 입력하여 변수에 저장하는 함수.

형식

1
2
// 최소 1개의 변수 필요
printf("입력양식", &변수1[, &변수2, &변수3, ...]);
구분 설명
입력양식 - 빈칸 또는 탭 문자
- %를 이용한 양식 변환 문자
그 외의 문자를 포함시켜서는 안된다.
&변수 - 값을 저장할 변수의 주소.
- & 는 주소 연산자이다.
- 문자열 변수는 &를 붙이지 않는다. (문자열 변수 자체로 주소를 가리키고 있음)

반드시 값을 입력받을 변수의 주소값, &변수명 에 값을 할당하도록 해야한다.

예시

1
2
3
4
5
int main() {
    int a;            // 값을 입력받을 변수 선언
    scanf("%d", &a);  // 숫자현(%d) 값을 입력받아 변수 a의 주소에 저장
    return EXIT_SUCCESS;
}

입력 양식

변환기호 영문 설명
%d decimal 키보드를 통해 부호 있는 10진 정수(signed)를 입력받음
%i integer 키보드를 통해 부호 있는 정수(10진수, 8진수, 16진수)를 입력받음
%u unsigned 키보드를 통해 부호 없는 10진 정수를 입력받음
%o octal 부호 없는 8진수를 입력받음
%x, %X hexa-decimal 부호 없는 16진수를 입력받음
%ld long decimal ” long 정수형을 입력받음
%lld long long decimal ” long long 정수형을 입력받음
%f float ” 실수형을 입력받음
%lf double ” double 실수형을 입력받음
%c character ” 한 개의 문자를 입력받음
%s string ” 널 문자 \0 로 끝나는 문자열을 입력받음

%d 는 십진수 형식의 데이터를 받는 양식이다.
double 형 데이터를 받기 위해서는 lf(long float) 을 써야 한다.

자료형 별 예시

정수형

1
2
3
4
5
6
7
8
9
10
11
void scanf_int(){
    int a;
    short b;
    long long c;
    printf("값을 입력해주세요 : \n");
    scanf("%d", &a);
    scanf("%hi", &b);
    scanf("%llx", &c);
    printf("--------------------\n");
    printf("%d, %d, %lld\n", a, b, c);
}
1
2
3
4
5
6
값을 입력해주세요 :
1    # 입력
0x30 # 입력
50   # 입력
--------------------
1, 48, 80  # 출력

실수형

1
2
3
4
5
6
7
void scanf_float(){
    float a;
    double b;
    scanf("%f %lf", &a, &b);
    printf("--------------------\n");
    printf("%f, %e\n", a, b);
}
1
2
3
4
1.23
586.193e-4
--------------------
1.230000, 5.861930e-02

중간에 콤마를 쓰는 경우

1
2
3
4
5
6
7
void scanf_with_comma(){
    int a;
    int b;
    scanf("%d, %d", &a, &b);
    printf("--------------------\n");
    printf("%d, %d\n", a, b);
}
1
2
3
5
--------------------
5, 46489824
  • 이 경우 원래처럼 순차적으로 enter를 이용해 값을 분리 입력할 수 없다.
  • 순차적으로 입력하면, 앞의 변수에는 값이 저장되지만, 뒤의 변수에는 쓰레기 값이 저장된다.
1
2
3
10, 20
--------------------
10, 20
  • 콤마를 사용할 경우에는, 입력 문자열에서도 콤마로 구분을 해 주어야 한다.

문자형과 문자열

1
2
3
4
5
6
7
8
void scanf_char_string() {
	char a;
	char b[100];       // 100개의 문자를 저장할 수 있는 배열. 문자열
	scanf("%c", &a);
	scanf("%s", b);    // 문자열은 &를 쓰지 않는다. (문자열 자체가 주소를 가리킴)
	printf("--------------------\n");
	printf("%c %s\n", a, b);
}
  • 문자형을 입력받을 때에는 &a 와 같이 주소 연산자를 사용한다.
  • 반면, 문자열을 입력받을 때에는 주소연산자를 쓰지 않는다.
1
2
3
4
5
# 문자열 중간에 공백이 포함된 경우
S
Grade Card
--------------------
S Grade
  • 입력 문자열 중간에 공백이 포함된 경우, 공백의 앞쪽 문자열만이 정상적으로 저장된다.
1
2
3
4
5
# 문자열 가장 앞에 공백이 있는 경우
S
 Grade Card
--------------------
S Grade
  • 입력 문자열 가장 앞에 공백이 있다면, 그 다음 문자열이 저장된다.
1
2
3
4
5
# 널 문자열 입력
S
Grade\0Card
--------------------
S Grade\0Card
  • 널 문자열은 문자열 그대로 입력된다.

Reference

C 프로그래밍 (김형근, 곽덕훈, 정재화 공저)
C 프로그래밍 강의 (방송통신대 - 이병래)

Comments