안녕하세요. BlockDMask입니다.
오늘은 C언어, C++에서 사용자의 입력을 받을 수 있는 함수 scanf에 대해서 알아보려고 합니다.
C언어에서 가장 기본이 되는 printf, scanf 함수 중 하나이므로 잘 알고 가시면 좋을 것 같습니다.
scanf나 scanf_s나 기본은 똑같으니, scanf_s를 쓰시는 분들도 scanf의 사용법을 알면 도움이 될 것입니다.
<목차>
1. scanf 함수란?
2. scanf 함수 예제
3. scanf 엔터 처리 방법
1. C, C++ scanf 함수 설명
1-1) 헤더 파일 및 함수 모양
- 헤더파일
<stdio.h>
- 함수의 모양
int scanf("입력받을 문자의 서식", 변수의 주소... )
int scanf(const char* format, ....)
scanf 함수는 표준입력 (stdin)에서 형식화된 데이터를 읽는 함수입니다.
첫 번째 매개변수의 형식에 맞게 두 번째, 세 번째... N번째 매개변수가 가리키는 위치에 데이터를 저장하는 함수입니다.
조금 더 쉽게 설명하면 첫 번째 매개변수의 형식에 맞게 데이터를 입력받는데, 그 데이터 들은 두 번째 세 번째.. N번째 매개변수로 들어온 변수에 저장을 합니다.
- 첫 번째 매개변수 "입력받을 문자의 서식"
scanf 함수의 첫번째 매개변수는 어떤 종류(숫자, 문자, 문자열 등)를 입력받을 것인지
그리고, 어떤 식으로 (숫자 2개 혹은 숫자, 숫자 이런 식) 사용자로부터 입력을 받을 것인지 정하는 부분입니다.
예를 들면 변수 num에 숫자 1개를 입력받고 싶다면
scanf("%d", &num) 이런식으로 "%d" 첫 번째 매개변수를 설정할 수 있습니다.
만약 변수 num1, num2에 숫자를 1개씩 총 2개를 입력받고 싶다면
scanf("%d, %d", &num1, &num2)
scanf("%d %d", &num1, &num2)
이런 식으로 입력받을 수 있습니다.
첫 번째 예제는 10, 20 이런 식으로 입력을 해야 하고
두 번째 예제는 10 20 이런 식으로 가운데 콤마가 없이 입력을 해도 됩니다.
이와 같이 첫 번째 매개변수는 사용자에게 어떤 식으로 입력을 받을 것인지 무엇을 입력받을 것인지 정해주는 부분입니다.
- 두 번째, 세 번째... N 번째 매개변수
두번째 세번째 .. N매개변수는 매개변수의 수가 정해져 있지 않습니다.
왜냐하면 첫 번째 매개변수에서 몇개의 데이터를 받을지 정할 수 있기 때문에 그 첫번째 매개변수에 따라서 뒤에 매개변수들의 수가 정해지기 때문입니다.
즉, 첫 번째 매개변수에서 설정한 입력받을 값의 수에 따라 몇개가 올지 정해집니다.
위에서 보신 바와 같이 첫번째 매개변수에서 숫자를 받을 %d가 1개이면 뒤에 이어서 오는 매개변수가 1개가 옵니다.
scanf("%d", &num)
반면
scanf("%d, %d", &num1, &num2)와 같이 숫자를 받을 %d의 개수가 2개이면 뒤에 이어서 오는 매개변수가 2개가 오게 됩니다.
이처럼 맨 첫 번째 매개변수에서 몇 개를 입력받을 것인지 정함에 따라서, 그 개수만큼 두 번째 세 번째... N번째 매개변수가 오게 됩니다.
- 반환 값 int
scanf 함수가 성공하면 읽어온 값의 개수를 반환하고
실패한다면 -1 (EOF)를 반환합니다.
1-2) scanf 함수에서 사용하는 서식 문자
그럼 첫 번째 인자로 오는 "입력받을 문자의 서식"에서 특별한 기능을 하는 문자들이 있습니다.
숫자 형태를 받을 것인지 문자형태를 받을것인지 문자열을 받을 것인지를 구분을 해서 받아야 합니다.
그게 구분이 되어야 메모리에 어느 정도 용량을 확보할지, 어떤 타입의 변수에 넣을지, scanf가 어디까지 그 값으로 인식할 것인지 등등 여러 가지 설정이 바뀌기 때문에 미리 타입을 지정해 놓는 것입니다.
그렇게 약속해 놓은 문자들을 서식 문자라고 합니다.
바로 아래에는 어떤 서식 문자가 어떤 값을 가리키는지 나열해보도록 하겠습니다.
%d : int 타입 정수형
%c : char 타입 문자형
%s : char* 타입 문자열
%lf : double 타입 실수
%f : float 타입 실수
1-3) scanf 함수에서 &의 의미
변수 앞에 &를 붙이게 되면 이는 해당 변수의 주소를 가리키게 됩니다.
int a; 라는 변수가 있다면 &a는 a의 주소를 가리킵니다.
scanf에서 두 번째 인자부터는 데이터를 받아들일 변수를 집어넣는데, 이때 &를 붙여서 변수의 주소를 가리키게 합니다.
이는 scanf에서는 전달되는 인자에 사용자가 입력 해준 값을 넣어주어야 하는데, 그 인자가 call by value 라면 복사만 될 뿐 인자로 넣어준 변수에는 들어오지 않기 때문에, call by reference를 이용하기 위해서 &를 붙입니다.
그렇기 때문에 일반 변수들을 보낼 때는 &을 붙여서 주소를 보내도록 하고 (call by reference).
배열의 이름과 같이 &를 붙이지 않아도 주소를 가리키는 것들은 &를 떼고 인자로 넣어주면 됩니다.
예를 들면 아래와 같이 변수와 배열이 존재한다고 했을 때,
char a;
char arr[10];
변수는 scanf("%c", &a)을 넣어야 하고
배열의 이름과 같이 주소를 가리키는 것들은 scanf("%s", arr) 와 같이 &를 붙이지 않아도 됩니다.
만약 배열의 특정 위치는 변수와 같으니 역시 &를 붙여야겠죠 scanf("%c", &arr[2]) 이와 같이 말이죠.
**C언어에서 scanf 를 하다 보면 보안 경고가 뜰 때가 있습니다.
이 경고는 무시하셔도 되며 상단에
#define _CRT_SECURE_NO_WARNINGS
을 입력하면 해결이 됩니다.
이 경고는 scanf와 같이 _s가 붙지 않은 함수보다는 scanf_s와 같이 입력받을 데이터의 사이즈를 입력하는 _s류 함수를 사용하라는 경고입니다.
_s가 붙지 않은 함수는 함수에 사용할 데이터 사이즈를 입력하지 않기 때문에 오버플로우와 같은 메모리 관련 위험이 존재하기 때문입니다.
2. C, C++ scanf 함수 예제
2-1) scanf 예제 - 정수 입력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int num;
printf("숫자 입력 : ");
scanf("%d", &num);
printf("입력한 숫자는 : %d 입니다.", num);
return 0;
}
|
cs |
scanf("%d", %num)과 같이 int 타입의 숫자를 입력받을 때는 %d의 서식기호를 사용하면 됩니다.
scanf에서 변수에 값을 입력받을때는 꼭 변수의 주소를 넘겨야 한다는 사실! & 붙이세요!
2-2) scanf 예제 - 문자 입력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
char c1;
printf("문자 입력 : ");
scanf("%c", &c1);
printf("입력한 문자는 : %c 입니다.", c1);
return 0;
}
|
cs |
char 타입의 문자를 입력 받을 때는 %c의 서식 문자를 이용하면 됩니다.
2-3) scanf 예제 - 문자열 입력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
char arr[20];
printf("문자열 입력 : ");
scanf("%s", arr);
printf("입력한 문자는 : %s 입니다.", arr);
return 0;
}
|
cs |
char* 타입, char[] 타입의 문자열을 입력받을 때는 %s 서식 기호를 사용합니다.
또한 scanf에서 인자로 넘겨줄 때는 배열의 이름 자체가 주소를 가리키기 때문에 &를 붙이지 않고 배열의 이름만 넘겨주면 됩니다.
2-4) scanf 예제 - 정수 두 개 입력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
int main(void)
{
int a;
int b;
int c;
int d;
printf("숫자 두개 입력. 숫자, 숫자 형태 : ");
scanf("%d, %d", &a, &b);
printf("입력한 숫자 2개는 : %d와 %d입니다.\n", a, b);
printf("\n숫자 두개 입력. 숫자 숫자 형태 : ");
scanf("%d %d", &c, &d);
printf("입력한 숫자 2개는 : %d와 %d입니다.\n", c, d);
return 0;
}
|
cs |
이렇게 %d를 이용해서 똑같이 숫자를 두 개 받는다고 해도
%d, %d 형태인지
%d %d 형태인지 인지에 따라
입력하는 방법이 달라지게 됩니다.
scanf("~~", ) 해당 함수에 첫 번째 인자에 만들어 놓은 형태를 잘 맞추어서 입력하셔야 합니다.
2-5) scanf 예제 - while 문 안에서 입력
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdbool.h> // C언어 bool 타입
int main(void)
{
char str[100];
while (true)
{
printf("문장 입력 : ");
scanf("%s", str);
printf("입력한 문장 : %s\n\n", str);
}
return 0;
}
|
cs |
이렇게 while 무한루프를 통해서 scanf를 계속해서 받을 수 있습니다.
C언어에서 bool 타입의 사용법이 궁금하시다면 [바로가기] 해당 포스트로 가시면 됩니다.
이상으로 C언어, C++에서 사용자 입력을 받는 scanf 함수에 대해서 알아보았습니다.
'<개인공부> > [C언어, C++]' 카테고리의 다른 글
[C언어/C++] printf 출력 함수 정리 및 예제 (4) | 2021.01.28 |
---|---|
[C언어/C++] C언어 bool 타입에 대해서 (C99) (2) | 2021.01.18 |
[C언어/C++] for 반복문 사용법 및 예제 총정리 (5) | 2020.12.28 |
[C언어/C++] while 반복문 설명 및 예제 (0) | 2020.12.25 |
[C언어/C++] islower, isupper 대문자 소문자 확인 (0) | 2020.12.21 |
[C언어/C++] tolower, toupper 대문자 소문자 변경 (1) | 2020.12.16 |
[C언어/C++] isspace 함수 (공백, 탭, 개행을 확인하는 함수) (0) | 2020.12.10 |
[C언어/C++] isalpha 함수 (알파벳을 확인하는 함수) (1) | 2020.12.03 |