# 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를 사용합니다.
'Coding > C언어 - Codeup' 카테고리의 다른 글
[코드업/Codeup][C언어] 1111 : %출력 문제풀이 (1) | 2024.09.03 |
---|---|
[코드업/Codeup][C언어] 1110 : 정수 그대로 출력하기 문제풀이 (0) | 2024.08.31 |
[코드업/Codeup][C언어] 1107 ~ 1108 반복 출력 문제 풀이 (0) | 2024.08.31 |
[코드업/Codeup][C언어] 1106 : int의 범위 - 문제 풀이 (0) | 2024.08.30 |
[코드업/Codeup] C언어 : 1101 ~ 1103 풀이 (0) | 2024.08.30 |