반응형

 

#include<stdio.h>

int main(int argc, char *argv[])
{
	int ID;
	char name[10];
	char grade;

	printf("이름: ");
	scanf("%s", name);
	printf("학점: ");
	scanf("%c", &grade);
	printf("학번: ");
	scanf("%d", &ID);

	printf("%s(%d)의 학점: %c", name, ID, grade);

	return 0;
}

위 코드를 실행하면 두 번째 호출되는 scanf가 무시되고 넘어간다.

이는 첫번째 입력 이후 버퍼에 \n이 남아있어 %c입력에서 \n이 들어가서 발생하는 문제이다.

그림1. grade변수에 \n이 들어간 모습

이를 해결할 수 있는 방법에는 두 가지 방법이 존재한다.


1. 의미없는 입력 추가

#include<stdio.h>

int main(int argc, char *argv[])
{
	int ID;
	char name[10];
	char grade;

	printf("이름: ");
	scanf("%s", name);
	while (getchar() != '\n'); // 여기서 개행문자가 없어진다.
	printf("학점: ");
	scanf("%c", &grade);
	printf("학번: ");
	scanf("%d", &ID);

	printf("%s(%d)의 학점: %c", name, ID, grade);

	return 0;
}

코드를 보면, getchar함수를 호출하여 버퍼에 남아있는 개행 문자를 입력받는 것을 확인할 수 있다.


2. scanf의 수정

#include<stdio.h>

int main(int argc, char *argv[])
{
	int ID;
	char name[10];
	char grade;

	printf("이름: ");
	scanf("%s", name);
	printf("학점: ");
	scanf(" %c", &grade); // 서식지정자 앞에 공백추가
	printf("학번: ");
	scanf("%d", &ID);

	printf("%s(%d)의 학점: %c", name, ID, grade);

	return 0;
}

두 번째 입력을 받는 scanf앞에 공백 한 칸을 추가해주면,

앞서 존재했던 모든 공백 문자를 무시하고 새로 입력을 받는다.


그 외(fflush함수를 호출해 입력 버퍼를 비우는 방법)

이 방법은 C표준이 아니다!
fflush함수는 출력 함수를 비우기 위해 설계된 함수이다.
#include<stdio.h>

int main(int argc, char *argv[])
{
	int ID;
	char name[10];
	char grade;

	printf("이름: ");
	scanf("%s", name);
	printf("학점: ");
	fflush(stdin); // 동작안함.
	scanf("%c", &grade);
	printf("학번: ");
	scanf("%d", &ID);

	printf("%s(%d)의 학점: %c", name, ID, grade);

	return 0;
}

Visual Studio 2013 이하의 버전에서만 fflush함수로 표준 입력 버퍼를 비울 수 있다고 한다.

따라서 위 코드는 항상 동작하지는 않는다.

반응형

'개념정리 > C' 카테고리의 다른 글

Visual Studio C4996 에러 처리  (0) 2021.04.13

+ Recent posts