일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 단축키정리
- SQL
- 개발자가 되기 위해 꼭 알아야 하는 IT용어
- 머신러닝 #학습내용정리
- 공부내용정리
- 웹 크롤링
- 기술블로그
- 옵셔널태그
- 스프링 입문
- 김영한 #SOLID #객체지향
- SafeUpdate
- 생성자 #자바 #기록남기기
- 머신러닝 #회귀 #규제
- GIT
- 그룹핑
- 에러포스팅
- MVC #디자인패턴
- 작업 영역
- 컬럼수정
- 크롬브라우저
- fastapi
- Numpy #TIL #넘파이 기초
- C언어 #문자열변환 #정수형변환
- 스프링부트
- 클래스 #아이디
- COMMIT
- 커밋
- 파이썬
- 개발공부
- 데이터 수집
- Today
- Total
데이터 분석가 몽구리
[C언어] 표준 입력 함수 scanf 본문
만능 표준 입력 함수 scanf
scanf는 scan format을 줄인 이름입니다. getchar 함수는 하나의 문자를 입력 받는 함수이고 gets 함수는 문자열을 입력 받는 함수입니다. 이 scanf 함수는 다양한 키워드를 사용하여 문자º문자열뿐만 아니라 정수, 실수까지 모두 입력 받을 수 있도록 형식화된 입력을 제공합니다.
#include <stdio.h>
void main()
{
int int_data;
float float_data;
scanf("%d", &int_data);
scanf("%f", &float_data);
printf("input : %d, %f\n", int_data, float_data);
}
scanf 함수에서 & 연산자를 사용하는 이유
scanf는 포인터 기술을 사용하여 값을 반환한다.
scanf에서 두 개의 정수 값을 입력 받아 num1 변수와 num2 변수에 저장한다고 가정해 보겠습니다. 여러 개의 값들을 동시에 입력 받아야 하기 때문에 return문을 사용할 수 없습니다. 그래서 포인터를 통해 입력 값을 저장할 두 변수의 '주소'를 활용하는 scanf 함수가 필요합니다.
& 연산자를 활용하여 사용자가 입력한 값을 저장할 변수의 주소를 넘겨주면 scanf함수는 해당 주소를 사용하여 입력 형식 키워드에 맞게 입력 값을 해당 변수에 넣어 줍니다.
scanf 함수로 문자열을 입력 받을 때 주의할 점
scanf 함수는 Enter키와 공백 문자를 사용하여 입력을 구분합니다. 그러다보니 문자열을 입력할 때 중간에 공백이 들어가면 자신이 원하는 문자열을 다 입력 받지 못하는 문제가 발생하기도 합니다. 예를 들어, 집주소를 "서울시 광진구 자양동"이라고 입력하면 "서울시"만 입력 받고 "광진구 자양동"은 입력 버퍼에 남게 됩니다.
따라서, 사용자가 입력하는 문자열에 공백이 포함된다면 scanf 대신에 gets 함수를 사용하는 것이 좋습니다.
scanf 함수 사용할 때 잘못된 사용자 입력 처리하기
scanf 함수를 사용하여 사용자에게 나이를 입력 받는 예제 작성해보겠습니다. -5나 200처럼 비정상적인 값을 입력하면 정상 값을 입력할 때까지 계속해서 입력을 받도록 코드를 구성해볼게요.
#include <stdio.h>
void main()
{
int num = 0;
// 정상적인 나이를 입력할 때까지 반복하기 위한 무한반복 사용
while (1)
{
printf("input age : ");
scanf("%d", &num); // 한 개의 정수 값을 입력받음
// 0보다 크고 130 이하인 숫자만 정상적인 나이로 인정
if (num > 0 && num <= 130) {
break;
}
else {
// 나이의 범위가 잘못 입력됨
printf("Incorrect Age!\n");
}
}
printf("your age : %d\n", num);
}
위의 코드는 정상으로 보이지만 치명적인 오류가 존재합니다. 해당 코드에서 "abc"라는 문자열을 입력하면 어떻게 될까요 ? 사용자가 나이에 "abc"를 입력하게 되면 "Incorrect Age!" 메시지를 무한 반복하게 됩니다.
이러한 현상이 발생하는 이유는 %d를 사용했는데 정수 형태의 숫자 패턴이 입력되지 않고 문자열이 입력되어 오류 값 0을 반환하게 됩니다. 입력 버퍼에는 이전에 입력했던 "abc"라는 값이 남아있어 계속 "Incorrect Age!"를 반복 출력합니다.
이 문제는 scanf 함수의 실행이 실패하게 되면 입력 버퍼에 저장된 내용을 rewind 함수로 지워주면 문제를 해결할 수 있습니다.
#include <stdio.h>
void main()
{
int num = 0;
// 정상적인 나이를 입력할 때까지 반복하기 위한 무한반복 사용
while (1)
{
printf("input age : ");
if (scanf("%d", &num) == 0) {
rewind(stdin); // 입력 버퍼를 모두 비움
printf("[Enter] digit number! \n");
}
else
{
if (num > 0 && num <= 130) {
break;
}
else {
// 나이의 범위가 잘못 입력됨
printf("Incorrect Age!\n");
}
}
}
printf("your age : %d\n", num);
}