y718j   2년 전

사용자에게서 체스판의 상태를 입력받기 위해서 2차원 배열을 선언하였고, 그 이후에 이중 for문을 사용해서 아래와 같이 입력을 받았습니다. 하지만 저렇게 입력을 받으면 계속해서 board[0][0]에 \n이 입력되어지고 그 다음에 사용자가 입력한 문자가 배열에 들어갑니다. 왜 이런 문제가 생기는지 알 수 있을까요?

bupjae   2년 전

fflush(stdin) 은 쓰면 안 됩니다.

fflush(stdin) 은 C 표준에 정의되지 않은 동작이며, 각 컴파일러마다 다른 동작을 할 수 있습니다.

Visual C++ 2013 또는 그 이전 버전에서는 입력 스트림의 버퍼를 비우는 역할을 하지만, redirect 없이 키보드에서 직접 입력받을 때에만 원하는 동작을 할 겁니다.

Visual C++ 2015 또는 그 이후 버전에서는 아무런 효과도 없습니다.

Visual C++ 가 아닌 다른 컴파일러에서는 전혀 다른 동작을 할 수 있습니다.

   

         

scanf 의 *대부분*의 format specifier 는 먼저 앞에 나오는 공백문자(\t, space, \n 등등)는 모두 버린 후, 공백문자가 아닌 글자부터 실제 읽어야 할 데이터로 취급합니다.

하지만 "%c" format specifier 는 공백문자 또한 정당한 데이터로 취급해서 읽어들입니다.

이를 방지하기 위해서는 "공백문자는 모두 읽고 버리시오" 라는 의미로 format string 에 space 를 지정할 수 있습니다.

예를 들어, 2번째 줄이 scanf("%d %d ", &N, &M); 이런 식으로 되어있다면, 정수 2개 바로 뒤에 있을 줄바꿈 문자 '\n'은 읽은 뒤에 버립니다. 

댓글을 작성하려면 로그인해야 합니다.