본문 바로가기
Coding/C언어 - Codeup

[코드업/Codeup][C언어] 1109 : 보안카드 접수증 문제풀이

by 이브(Eve) 2024. 8. 31.

# 1109 : 보안카드 접수증

이름, 나이, 부서코드, 보안키를 순서대로 줄을 바꿔 출력하는 프로그램 작성하기

#include <stdio.h>

int main()
{
	char name[20];
	int age;
	char code;
	double key;

	scanf("%s", name);
	scanf("%d", &age);
	getchar(); // 입력 버퍼에 남아있는 개행 문자(\n) 제거
	scanf("%c", &code);
	scanf("%lf", &key);

	printf("%s\n%d\n%c\n%lg", name, age, code, key);

	return 0;
}

풀이 1. getchar();을 사용한 이유 

scanf("%d", &age); 코드가 진행될 때 나이를 입력하고 엔터키를 누르게 됩니다. 이때 엔터키로 인해 입력 버퍼에는 개행 문자(줄바꿈 문자) \n이 그대로 남아있게 됩니다.

  • 입력 : 20
  • 실제로 입력 버퍼에 들어가는 값: 20\n
  • 입력 버퍼에 남아있는 값 : \n (입력받은 나이 값은 입력 버퍼에서 변수 age로 이동되어 저장됩니다.)

이 상태에서 바로 scanf("%c", &code);로 문자 하나를 입력받으려고 할 경우, 입력 버퍼에 남아있던 \n가 변수 code에 저장됩니다.

  • scanf("%c", &code); 코드 실행
  • 입력 버퍼에 남아있던 \n가 code라는 변수에 저장 (컴퓨터는 %c로 입력 버퍼에 남아있는 \n을 읽어오면서, 단일 문자 하나를 code라는 변수에 저장하였으니 더 이상 입력을 받을 필요가 없다고 판단합니다.)
  • 그 다음 코드인 scanf("%lf", &key); 코드가 실행됨
  • 입력 : A\n
  • 입력받을 형식(%lf)과 맞지 않음. ➡️ 에러 발생!

getchar() 함수 : 입력 버퍼에서 문자 하나를 읽어오는 함수

변수에 getchar()을 쓰게 되면 입력 버퍼에서 문자 하나를 읽어와 변수에 저장하지만, 변수 없이 getchar()만 쓸 경우 한 문자를 읽어오고 버립니다.

나이와 코드를 입력받는 코드 사이에 getchar()을 넣어 개행 문자를 버려주면서 코드는 오류 없이 잘 작동하게 됩니다.

풀이 2. %lg 형식지정자

%g는 소수점 이하의 불필요한 0을 제거하고 소수점이나 지수 형식 중에 적절한 값을 선택하여 값을 출력합니다.

l은 double형을 나타내기 위해 붙여주었습니다. (double형을 출력할 때 쓰이는 %lf와 동일한 의미입니다.)

%lg를 사용하면 3.14를 입력하였을 때 그대로 3.14를 출력할 수 있습니다.

 

참고 : float형이라면 %g를 사용합니다.