상세 컨텐츠

본문 제목

(C언어) scanf와 fgets 함수를 같이 사용하면 입력 오류 발생

개발이야기/C or C++ 언어 관련

by mycatdid0 2022. 10. 11. 13:06

본문

반응형

(포스팅 2022.10.11)

 

아래와 같이 Visual Studio에서 c언어로 작업중이었는데, scanf_s() 직후의 fgets() 입력이 무시되는 경우가 발생하였습니다.

 

scanf()와 fgets()의 충돌

이러한 문제는, scanf_s()에서 [엔터키]를 누를 때 "\r\n"이 입력되어서 발생합니다.

  1. 사용자가 scanf_s()에서 숫자를 입력후 [엔터키]를 누름. 입력 버퍼에 "\r\n"이 추가됨.
  2. scanf_s()가 '\r' 하나만 받아도 엔터키로 인식을 해서 입력을 종료함. 
  3. 입력 버퍼에 남은 '\n' 은 아직 처리 되지 않음.
  4. fgets()는 '\n'를 [엔터키]로 인식하여 입력을 종료함.

 

아래와 같이 getchar()으로 입력버퍼의 내용을 받아 보면, code 10 = '\n' 이 들어있었음을 알 수 있습니다.

scanf()와 fgets()의 충돌

 

 

입력 버퍼에 남은 '\n'을 제거하는 것이 해결책입니다. getchar()를 사용하는 것이 간단합니다.

 

#include <stdio.h>

#define MAX_NAME 20

int main()
{
	int id;
	char name[MAX_NAME] = { 0, };
	int price;

	printf("ID : ");
	scanf_s("%d", &id);
	getchar(); // 입력 버퍼에 남은 문자 하나를 제거
	//		fflush(stdin); // 해당 명령은 output 버퍼만을 비우므로 문제 해결 안됨
	printf("이름:");
	fgets(name, MAX_NAME - 1, stdin);
	printf("단가:");
	scanf_s("%d", &price);
}

 

실행 결과는 다음과 같습니다.

scanf()와 fgets()의 충돌

포스팅은 여기까지입니다. 궁금하신 점 댓글 주세요.

 

언제나 감사드립니다.

 

반응형

관련글 더보기

댓글 영역