코딩하는 몽구리

[C언어] 표준 입력 함수 scanf 본문

카테고리 없음

[C언어] 표준 입력 함수 scanf

코딩구리 2024. 4. 22. 13:18

만능 표준 입력 함수 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);
}